library(ggplot2)
library(dplyr)
library(stats)

True value in set1, sim1

TrueValue_set1 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_1[1, 2])), ", ")[[1]]
#average <- mean(TrueValues_set1)
plot(TrueValue_set1, type = "l", pch = 16, col = "blue", main = "True Values in sim0", xlab = "Iteration", ylab = "Value")


#TrueValue_set1_sim0 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_1[1, 2])), ", ")[[1]]
#unlist(aggregated_results_1[1, 2])
#clean_str = gsub("\\[|\\]", "", TrueValue_sim0)
#TrueValue_set1_sim1 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_1[2, 2])), ", ")[[1]]

#print(Values)
#X <- 1:100
#plot(TrueValue_set1_sim0, type = "l", pch = 16, col = "blue", main = "True Values in sim0", xlab = "Iteration", ylab = "Value")
#plot(TrueValue_set1_sim1, type = "l", pch = 16, col = "blue", main = "True Values in sim1", xlab = "Iteration", ylab = "Value")

#fit <- lm(Values ~ X)
#abline(fit, col = "red")

True values in set 1, all sim

# Initialize an empty vector to store the True values
TrueValues_set1 <- numeric()

# Loop through each iteration (n)
for (n in 1:10) {
  # Extract True values from the aggregated_results_1 dataframe
  TrueValue_set1 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_1[n, 2])), ", ")[[1]]
  
  # Append the True values to the vector
  TrueValues_set1 <- c(TrueValues_set1, as.numeric(TrueValue_set1))
}

# Calculate the average of True values
average <- mean(TrueValues_set1)

# Plot the average
plot(TrueValues_set1, type = "l", pch = 16, col = "blue", main = "True Values in set 1", xlab = "Iteration", ylab = "Value")

# Add a horizontal line for the average
abline(h = average, col = "red", lwd = 2)

Expected value in set1, all sim

# Initialize an empty vector to store the True values
ExpectedValues_set1 <- numeric()

# Loop through each iteration (n)
for (n in 1:10) {
  # Extract True values from the aggregated_results_1 dataframe
  ExpectedValue_set1 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_1[n, 3])), ", ")[[1]]
  
  # Append the True values to the vector
  ExpectedValues_set1 <- c(ExpectedValues_set1, as.numeric(ExpectedValue_set1))
}

# Calculate the average of True values
average <- mean(ExpectedValues_set1)

# Plot the average
plot(ExpectedValues_set1, type = "l", pch = 16, col = "blue", main = "Expected Values in set 1", xlab = "Iteration", ylab = "Value")

# Add a horizontal line for the average
abline(h = average, col = "red", lwd = 2)

True and Expected Values in set 1

# Initialize empty vectors to store true and expected values
TrueValues_set1 <- numeric()
ExpectedValues_set1 <- numeric()

# Loop through each iteration (n)
for (n in 1:10) {
  # Extract True values from the aggregated_results_1 dataframe
  TrueValue_set1 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_1[n, 2])), ", ")[[1]]
  
  # Extract Expected values from the aggregated_results_1 dataframe
  ExpectedValue_set1 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_1[n, 3])), ", ")[[1]]
  
  # Append the True and Expected values to their respective vectors
  TrueValues_set1 <- c(TrueValues_set1, as.numeric(TrueValue_set1))
  ExpectedValues_set1 <- c(ExpectedValues_set1, as.numeric(ExpectedValue_set1))
}

# Calculate the average of True values
average_true <- mean(TrueValues_set1)

# Calculate the average of Expected values
average_expected <- mean(ExpectedValues_set1)

# Plot True and Expected values on the same plot
plot(TrueValues_set1, type = "l", pch = 16, col = "blue", main = "True vs Expected Values in set 1", xlab = "Iteration", ylab = "Value")
lines(ExpectedValues_set1, type = "l", pch = 16, col = "red")

# Add legend
legend("topright", legend = c("True Values", "Expected Values"), col = c("blue", "red"), lty = 1, cex = 0.8)

# Add horizontal lines for the averages
abline(h = average_true, col = "blue", lwd = 1)
abline(h = average_expected, col = "red", lwd = 1)

Bids in set1, sim1

Bids_set1 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_1[1, 4])), ", ")[[1]]
#average <- mean(TrueValues_set1)
plot(Bids_set1, type = "l", pch = 16, col = "blue", main = "True Values in sim0", xlab = "Iteration", ylab = "Value")

Bids in set 1, all sim

# Initialize an empty vector to store the True values
Bids_set1 <- numeric()

# Loop through each iteration (n)
for (n in 1:10) {
  # Extract True values from the aggregated_results_1 dataframe
  Bid_set1 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_1[n, 4])), ", ")[[1]]
  
  # Append the True values to the vector (corrected typo)
  Bids_set1 <- c(Bids_set1, as.numeric(Bid_set1))
}

# Check if the vector is properly populated
#print(Bids_set1)

# Calculate the average of True values
average <- mean(Bids_set1, na.rm = TRUE)

# Plot the values
plot(Bids_set1, type = "l", pch = 16, col = "blue", main = "Bid vs Ask in set 1", xlab = "Iteration", ylab = "Value")

# Add a horizontal line for the average
abline(h = average, col = "red", lwd = 2)

Bids and Asks Overall

# Initialize empty vectors to store the Bid and Ask values
Bids_set1 <- numeric()
Asks_set1 <- numeric()

# Loop through each iteration (n)
for (n in 1:10) {
  # Extract Bid values from the aggregated_results_1 dataframe
  Bid_set1 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_1[n, 4])), ", ")[[1]]
  
  # Extract Ask values from the aggregated_results_1 dataframe (next column)
  Ask_set1 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_1[n, 5])), ", ")[[1]]
  
  # Append the Bid and Ask values to their respective vectors
  Bids_set1 <- c(Bids_set1, as.numeric(Bid_set1))
  Asks_set1 <- c(Asks_set1, as.numeric(Ask_set1))
}

# Calculate the average of Bid and Ask values
average_bids <- mean(Bids_set1, na.rm = TRUE)
average_asks <- mean(Asks_set1, na.rm = TRUE)

# Plot the Bid and Ask values on the same plot
plot(Bids_set1, type = "l", pch = 16, col = "blue", main = "Bids vs Asks in set 1", xlab = "Iteration", ylab = "Value")
lines(Asks_set1, type = "l", pch = 16, col = "red")

# Add legend
legend("topright", legend = c("Bids", "Asks"), col = c("blue", "red"), lty = 1, cex = 0.8)

# Add horizontal lines for the averages
abline(h = average_bids, col = "blue", lty = 1)
abline(h = average_asks, col = "red", lty = 1)

Start From Here

set 1 (6 informed)

# Initialize matrices to store averages for each position
average_true <- matrix(NA, nrow = 100, ncol = 10)
average_expected <- matrix(NA, nrow = 100, ncol = 10)

# Loop through each simulation (n)
for (n in 1:10) {
  # Extract True values from the aggregated_results_4 dataframe
  TrueValues_set1 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_1[n, 2])), ", ")
  
  # Extract Expected values from the aggregated_results_4 dataframe
  ExpectedValues_set1 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_1[n, 3])), ", ")
  
  # Loop through each position (i)
  for (i in 1:100) {
    # Extract True and Expected values for the i-th position
    True_values <- sapply(TrueValues_set1, function(x) as.numeric(x[i]))
    Expected_values <- sapply(ExpectedValues_set1, function(x) as.numeric(x[i]))
    
    # Calculate the average of True and Expected values for the i-th position
    average_true[i, n] <- mean(True_values, na.rm = TRUE)
    average_expected[i, n] <- mean(Expected_values, na.rm = TRUE)
  }
}

# Calculate the overall average for each position across all simulations
overall_average_true <- rowMeans(average_true, na.rm = TRUE)
overall_average_expected <- rowMeans(average_expected, na.rm = TRUE)

# Plot the overall averages
plot(overall_average_true, type = "l", pch = 16, col = "blue", main = "Overall Average of True vs Expected Values", xlab = "Position in List", ylab = "Value", ylim = c(min(c(overall_average_true, overall_average_expected)), max(c(overall_average_true, overall_average_expected))))
lines(overall_average_expected, type = "l", pch = 16, col = "red")
legend("topright", legend = c("True Values", "Expected Values"), col = c("blue", "red"), lty = 1, cex = 0.8)

# Initialize matrices to store averages for each position
average_bid <- matrix(NA, nrow = 100, ncol = 10)
average_ask <- matrix(NA, nrow = 100, ncol = 10)

# Loop through each simulation (n)
for (n in 1:10) {
  # Extract True values from the aggregated_results_4 dataframe
  Bids_set1 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_1[n, 4])), ", ")
  
  # Extract Expected values from the aggregated_results_4 dataframe
  Asks_set1 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_1[n, 5])), ", ")
  
  # Loop through each position (i)
  for (i in 1:100) {
    # Extract True and Expected values for the i-th position
    Bids <- sapply(Bids_set1, function(x) as.numeric(x[i]))
    Asks <- sapply(Asks_set1, function(x) as.numeric(x[i]))
    
    # Calculate the average of True and Expected values for the i-th position
    average_bid[i, n] <- mean(Bids, na.rm = TRUE)
    average_ask[i, n] <- mean(Asks, na.rm = TRUE)
  }
}

# Calculate the overall average for each position across all simulations
overall_average_bid <- rowMeans(average_bid, na.rm = TRUE)
overall_average_ask <- rowMeans(average_ask, na.rm = TRUE)

## True Value
# Initialize matrices to store averages for each position
average_true <- matrix(NA, nrow = 100, ncol = 10)
average_expected <- matrix(NA, nrow = 100, ncol = 10)

# Loop through each simulation (n)
for (n in 1:10) {
  # Extract True values from the aggregated_results_4 dataframe
  TrueValues_set1 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_1[n, 2])), ", ")
  
  # Extract Expected values from the aggregated_results_4 dataframe
  ExpectedValues_set1 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_1[n, 3])), ", ")
  
  # Loop through each position (i)
  for (i in 1:100) {
    # Extract True and Expected values for the i-th position
    True_values <- sapply(TrueValues_set1, function(x) as.numeric(x[i]))
    Expected_values <- sapply(ExpectedValues_set1, function(x) as.numeric(x[i]))
    
    # Calculate the average of True and Expected values for the i-th position
    average_true[i, n] <- mean(True_values, na.rm = TRUE)
    average_expected[i, n] <- mean(Expected_values, na.rm = TRUE)
  }
}

# Calculate the overall average for each position across all simulations
overall_average_true <- rowMeans(average_true, na.rm = TRUE)
overall_average_expected <- rowMeans(average_expected, na.rm = TRUE)

# Plot the overall averages
#plot(overall_average_true, type = "l", pch = 16, col = "blue", main = "Overall Average of True vs Expected Values", xlab = "Position in List", ylab = "Value", ylim = c(min(c(overall_average_true, overall_average_expected)), max(c(overall_average_true, overall_average_expected))))
#lines(overall_average_expected, type = "l", pch = 16, col = "red")
#legend("topright", legend = c("True Values", "Expected Values"), col = c("blue", "red"), lty = 1, cex = 0.8)

# Plot the overall averages
plot(overall_average_bid, type = "l", pch = 16, col = "blue", main = "Overall Average of Bids vs Asks & True vs Expected Values", xlab = "Position in List", ylab = "Value", ylim = c(min(c(overall_average_bid, overall_average_ask)), max(c(overall_average_bid, overall_average_ask))))
lines(overall_average_ask, type = "l", pch = 16, col = "red")
lines(overall_average_true, type = "l", pch = 16, col = "green")
lines(overall_average_expected, type = "l", pch = 16, col = "purple")
legend("topright", legend = c("Bids", "Asks", "True Value", "Expected Value"), col = c("blue", "red", "green", "purple"), lty = 1, cex = 0.8)

Pick sim 5 as a example

TrueValue_set1 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_1[5, 2])), ", ")[[1]]

Bids_set1 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_1[5, 4])), ", ")[[1]]
Asks_set1 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_1[5, 5])), ", ")[[1]]

plot(TrueValue_set1, 
     type = "l", 
     pch = 16, 
     col = "green", 
     main = "True Values in Simulation 5", 
     xlab = "Iteration", 
     ylab = "Value", 
     ylim = c(min(c(as.numeric(TrueValue_set1), as.numeric(Bids_set1), as.numeric(Asks_set1))), 
              max(c(as.numeric(TrueValue_set1), as.numeric(Bids_set1), as.numeric(Asks_set1)))))
lines(Bids_set1, type = "l", pch = 16, col = "blue")
lines(Asks_set1, type = "l", pch = 16, col = "red")
legend("topleft", legend = c("Bids", "Asks", "True Value"), col = c("blue", "red", "green"), lty = 1, cex = 0.8)

MM_pnl_set1 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_1[5, 6])), ", ")[[1]]
Informed1_pnl_set1 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_1[5, 8])), ", ")[[1]]
Informed2_pnl_set1 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_1[5, 10])), ", ")[[1]]
Informed3_pnl_set1 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_1[5, 12])), ", ")[[1]]
Informed4_pnl_set1 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_1[5, 14])), ", ")[[1]]
Informed5_pnl_set1 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_1[5, 16])), ", ")[[1]]
Informed6_pnl_set1 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_1[5, 18])), ", ")[[1]]

#Bids_set1 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_1[5, 4])), ", ")[[1]]
#Asks_set1 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_1[5, 5])), ", ")[[1]]

plot(MM_pnl_set1, 
     type = "l", 
     pch = 16, 
     col = "black", 
     main = "PNL Simulation 5", 
     xlab = "Position in List", 
     ylab = "Value",
     ylim = c(min(c(as.numeric(MM_pnl_set1), as.numeric(Informed1_pnl_set1), as.numeric(Informed2_pnl_set1), as.numeric(Informed3_pnl_set1), as.numeric(Informed4_pnl_set1), as.numeric(Informed5_pnl_set1), as.numeric(Informed6_pnl_set1))), 
              max(c(as.numeric(MM_pnl_set1), as.numeric(Informed1_pnl_set1), as.numeric(Informed2_pnl_set1), as.numeric(Informed3_pnl_set1), as.numeric(Informed4_pnl_set1), as.numeric(Informed5_pnl_set1), as.numeric(Informed6_pnl_set1)))))

lines(Informed1_pnl_set1, type = "l", pch = 16, col = "red")
lines(Informed2_pnl_set1, type = "l", pch = 16, col = "green")
lines(Informed3_pnl_set1, type = "l", pch = 16, col = "yellow")
lines(Informed4_pnl_set1, type = "l", pch = 16, col = "blue")
lines(Informed5_pnl_set1, type = "l", pch = 16, col = "purple")
lines(Informed6_pnl_set1, type = "l", pch = 16, col = "orange")

# Add legend
legend("bottomleft", legend = c("Market Maker", "Informed 1", "Informed 2", "Informed 3", "Informed 4", "Informed 5", "Informed 6"), col = c("black", "red", "green", "yellow", "blue", "purple", "orange"), lty = 1, cex = 0.8)

MM_pnl_set1 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_1[5, 7])), ", ")[[1]]
Informed1_pnl_set1 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_1[5, 9])), ", ")[[1]]
Informed2_pnl_set1 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_1[5, 11])), ", ")[[1]]
Informed3_pnl_set1 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_1[5, 13])), ", ")[[1]]
Informed4_pnl_set1 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_1[5, 15])), ", ")[[1]]
Informed5_pnl_set1 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_1[5, 17])), ", ")[[1]]
Informed6_pnl_set1 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_1[5, 19])), ", ")[[1]]

#Bids_set1 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_1[5, 4])), ", ")[[1]]
#Asks_set1 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_1[5, 5])), ", ")[[1]]

plot(MM_pnl_set1, 
     type = "l", 
     pch = 16, 
     col = "black", 
     main = "POS in sim 5", 
     xlab = "Position in List", 
     ylab = "Value", 
     ylim = c(min(c(as.numeric(MM_pnl_set1), as.numeric(Informed1_pnl_set1), as.numeric(Informed2_pnl_set1), as.numeric(Informed3_pnl_set1), as.numeric(Informed4_pnl_set1), as.numeric(Informed5_pnl_set1), as.numeric(Informed6_pnl_set1))), 
              max(c(as.numeric(MM_pnl_set1), as.numeric(Informed1_pnl_set1), as.numeric(Informed2_pnl_set1), as.numeric(Informed3_pnl_set1), as.numeric(Informed4_pnl_set1), as.numeric(Informed5_pnl_set1), as.numeric(Informed6_pnl_set1)))))

lines(Informed1_pnl_set1, type = "l", pch = 16, col = "red")
lines(Informed2_pnl_set1, type = "l", pch = 16, col = "green")
lines(Informed3_pnl_set1, type = "l", pch = 16, col = "yellow")
lines(Informed4_pnl_set1, type = "l", pch = 16, col = "blue")
lines(Informed5_pnl_set1, type = "l", pch = 16, col = "purple")
lines(Informed6_pnl_set1, type = "l", pch = 16, col = "orange")

# Add legend
legend("bottomleft", legend = c("Market Maker", "Informed 1", "Informed 2", "Informed 3", "Informed 4", "Informed 5", "Informed 6"), col = c("black", "red", "green", "yellow", "blue", "purple", "orange"), lty = 1, cex = 0.8)

# Initialize matrices to store averages for each position
average_MM_pnl <- matrix(NA, nrow = 100, ncol = 10)
average_Informed1_pnl <- matrix(NA, nrow = 100, ncol = 10)
average_Informed2_pnl <- matrix(NA, nrow = 100, ncol = 10)
average_Informed3_pnl <- matrix(NA, nrow = 100, ncol = 10)
average_Informed4_pnl <- matrix(NA, nrow = 100, ncol = 10)
average_Informed5_pnl <- matrix(NA, nrow = 100, ncol = 10)
average_Informed6_pnl <- matrix(NA, nrow = 100, ncol = 10)

# Loop through each simulation (n)
for (n in 1:10) {

  MM_pnl_set1 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_1[n, 6])), ", ")

  Informed1_pnl_set1 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_1[n, 8])), ", ")
  
  Informed2_pnl_set1 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_1[n, 10])), ", ")
  
  Informed3_pnl_set1 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_1[n, 12])), ", ")
  
  Informed4_pnl_set1 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_1[n, 14])), ", ")
  
  Informed5_pnl_set1 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_1[n, 16])), ", ")
  
  Informed6_pnl_set1 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_1[n, 18])), ", ")
  
  # Loop through each position (i)
  for (i in 1:100) {
    # Extract True and Expected values for the i-th position
    MM_pnl <- sapply(MM_pnl_set1, function(x) as.numeric(x[i]))
    Informed1_pnl <- sapply(Informed1_pnl_set1, function(x) as.numeric(x[i]))
    Informed2_pnl <- sapply(Informed2_pnl_set1, function(x) as.numeric(x[i]))
    Informed3_pnl <- sapply(Informed3_pnl_set1, function(x) as.numeric(x[i]))
    Informed4_pnl <- sapply(Informed4_pnl_set1, function(x) as.numeric(x[i]))
    Informed5_pnl <- sapply(Informed5_pnl_set1, function(x) as.numeric(x[i]))
    Informed6_pnl <- sapply(Informed6_pnl_set1, function(x) as.numeric(x[i]))
    
    # Calculate the average of True and Expected values for the i-th position
    average_MM_pnl[i, n] <- mean(MM_pnl, na.rm = TRUE)
    average_Informed1_pnl[i, n] <- mean(Informed1_pnl, na.rm = TRUE)
    average_Informed2_pnl[i, n] <- mean(Informed2_pnl, na.rm = TRUE)
    average_Informed3_pnl[i, n] <- mean(Informed3_pnl, na.rm = TRUE)
    average_Informed4_pnl[i, n] <- mean(Informed4_pnl, na.rm = TRUE)
    average_Informed5_pnl[i, n] <- mean(Informed5_pnl, na.rm = TRUE)
    average_Informed6_pnl[i, n] <- mean(Informed6_pnl, na.rm = TRUE)
  }
}

# Calculate the overall average for each position across all simulations
overall_average_MM_pnl <- rowMeans(average_MM_pnl, na.rm = TRUE)
overall_average_Informed1_pnl <- rowMeans(average_Informed1_pnl, na.rm = TRUE)
overall_average_Informed2_pnl <- rowMeans(average_Informed2_pnl, na.rm = TRUE)
overall_average_Informed3_pnl <- rowMeans(average_Informed3_pnl, na.rm = TRUE)
overall_average_Informed4_pnl <- rowMeans(average_Informed4_pnl, na.rm = TRUE)
overall_average_Informed5_pnl <- rowMeans(average_Informed5_pnl, na.rm = TRUE)
overall_average_Informed6_pnl <- rowMeans(average_Informed6_pnl, na.rm = TRUE)

# Plot the overall averages
plot(overall_average_MM_pnl, type = "l", pch = 16, col = "black", main = "Overall Average PNL", xlab = "Position in List", ylab = "Value", ylim = c(min(c(overall_average_MM_pnl, overall_average_Informed1_pnl, overall_average_Informed2_pnl, overall_average_Informed3_pnl, overall_average_Informed4_pnl, overall_average_Informed5_pnl, overall_average_Informed6_pnl)), max(c(overall_average_MM_pnl, overall_average_Informed1_pnl, overall_average_Informed2_pnl, overall_average_Informed3_pnl, overall_average_Informed4_pnl, overall_average_Informed5_pnl, overall_average_Informed6_pnl))))
lines(overall_average_Informed1_pnl, type = "l", pch = 16, col = "red")
lines(overall_average_Informed2_pnl, type = "l", pch = 16, col = "green")
lines(overall_average_Informed3_pnl, type = "l", pch = 16, col = "yellow")
lines(overall_average_Informed4_pnl, type = "l", pch = 16, col = "blue")
lines(overall_average_Informed5_pnl, type = "l", pch = 16, col = "purple")
lines(overall_average_Informed6_pnl, type = "l", pch = 16, col = "orange")

# Add legend
legend("bottomleft", legend = c("Market Maker", "Informed 1", "Informed 2", "Informed 3", "Informed 4", "Informed 5", "Informed 6"), col = c("black", "red", "green", "yellow", "blue", "purple", "orange"), lty = 1, cex = 0.8)

# Initialize matrices to store averages for each position
average_MM_pos <- matrix(NA, nrow = 100, ncol = 10)
average_Informed1_pos <- matrix(NA, nrow = 100, ncol = 10)
average_Informed2_pos <- matrix(NA, nrow = 100, ncol = 10)
average_Informed3_pos <- matrix(NA, nrow = 100, ncol = 10)
average_Informed4_pos <- matrix(NA, nrow = 100, ncol = 10)
average_Informed5_pos <- matrix(NA, nrow = 100, ncol = 10)
average_Informed6_pos <- matrix(NA, nrow = 100, ncol = 10)

# Loop through each simulation (n)
for (n in 1:10) {

  MM_pos_set1 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_1[n, 7])), ", ")

  Informed1_pos_set1 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_1[n, 9])), ", ")
  
  Informed2_pos_set1 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_1[n, 11])), ", ")
  
  Informed3_pos_set1 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_1[n, 13])), ", ")
  
  Informed4_pos_set1 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_1[n, 15])), ", ")
  
  Informed5_pos_set1 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_1[n, 17])), ", ")
  
  Informed6_pos_set1 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_1[n, 19])), ", ")
  
  # Loop through each position (i)
  for (i in 1:100) {
    # Extract True and Expected values for the i-th position
    MM_pos <- sapply(MM_pos_set1, function(x) as.numeric(x[i]))
    Informed1_pos <- sapply(Informed1_pos_set1, function(x) as.numeric(x[i]))
    Informed2_pos <- sapply(Informed2_pos_set1, function(x) as.numeric(x[i]))
    Informed3_pos <- sapply(Informed3_pos_set1, function(x) as.numeric(x[i]))
    Informed4_pos <- sapply(Informed4_pos_set1, function(x) as.numeric(x[i]))
    Informed5_pos <- sapply(Informed5_pos_set1, function(x) as.numeric(x[i]))
    Informed6_pos <- sapply(Informed6_pos_set1, function(x) as.numeric(x[i]))
    
    # Calculate the average of True and Expected values for the i-th position
    average_MM_pos[i, n] <- mean(MM_pos, na.rm = TRUE)
    average_Informed1_pos[i, n] <- mean(Informed1_pos, na.rm = TRUE)
    average_Informed2_pos[i, n] <- mean(Informed2_pos, na.rm = TRUE)
    average_Informed3_pos[i, n] <- mean(Informed3_pos, na.rm = TRUE)
    average_Informed4_pos[i, n] <- mean(Informed4_pos, na.rm = TRUE)
    average_Informed5_pos[i, n] <- mean(Informed5_pos, na.rm = TRUE)
    average_Informed6_pos[i, n] <- mean(Informed6_pos, na.rm = TRUE)
  }
}

# Calculate the overall average for each position across all simulations
overall_average_MM_pos <- rowMeans(average_MM_pos, na.rm = TRUE)
overall_average_Informed1_pos <- rowMeans(average_Informed1_pos, na.rm = TRUE)
overall_average_Informed2_pos <- rowMeans(average_Informed2_pos, na.rm = TRUE)
overall_average_Informed3_pos <- rowMeans(average_Informed3_pos, na.rm = TRUE)
overall_average_Informed4_pos <- rowMeans(average_Informed4_pos, na.rm = TRUE)
overall_average_Informed5_pos <- rowMeans(average_Informed5_pos, na.rm = TRUE)
overall_average_Informed6_pos <- rowMeans(average_Informed6_pos, na.rm = TRUE)

# Plot the overall averages
plot(overall_average_MM_pos, type = "l", pch = 16, col = "black", main = "Overall Average Position", xlab = "Position in List", ylab = "Value", ylim = c(min(c(overall_average_MM_pos, overall_average_Informed1_pos, overall_average_Informed2_pos, overall_average_Informed3_pos, overall_average_Informed4_pos, overall_average_Informed5_pos, overall_average_Informed6_pos)), max(c(overall_average_MM_pos, overall_average_Informed1_pos, overall_average_Informed2_pos, overall_average_Informed3_pos, overall_average_Informed4_pos, overall_average_Informed5_pos, overall_average_Informed6_pos))))

#for (i in seq_along(overall_average_MM_pos)) {
  #if (overall_average_MM_pos[i] != 0) {
    #points(i, overall_average_MM_pos[i], col = "red", pch = 16)
  #}
#}

#points(overall_average_MM_pos, col = "red", pch = 16)
lines(overall_average_Informed1_pos, type = "l", pch = 16, col = "red")
lines(overall_average_Informed2_pos, type = "l", pch = 16, col = "green")
lines(overall_average_Informed3_pos, type = "l", pch = 16, col = "yellow")
lines(overall_average_Informed4_pos, type = "l", pch = 16, col = "blue")
lines(overall_average_Informed5_pos, type = "l", pch = 16, col = "purple")
lines(overall_average_Informed6_pos, type = "l", pch = 16, col = "orange")

# Add legend
legend("bottomleft", legend = c("Market Maker", "Informed 1", "Informed 2", "Informed 3", "Informed 4", "Informed 5", "Informed 6"), col = c("black", "red", "green", "yellow", "blue", "purple", "orange"), lty = 1, cex = 0.8)

set 2 (1 Informed + 1 noisy informed + 1 noisy + 1 stochastic noisy + 1 mr + 1 mom)

# Initialize matrices to store averages for each position
average_true <- matrix(NA, nrow = 100, ncol = 10)
average_expected <- matrix(NA, nrow = 100, ncol = 10)

# Loop through each simulation (n)
for (n in 1:10) {
  # Extract True values from the aggregated_results_4 dataframe
  TrueValues_set2 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_2[n, 2])), ", ")
  
  # Extract Expected values from the aggregated_results_4 dataframe
  ExpectedValues_set2 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_2[n, 3])), ", ")
  
  # Loop through each position (i)
  for (i in 1:100) {
    # Extract True and Expected values for the i-th position
    True_values <- sapply(TrueValues_set2, function(x) as.numeric(x[i]))
    Expected_values <- sapply(ExpectedValues_set2, function(x) as.numeric(x[i]))
    
    # Calculate the average of True and Expected values for the i-th position
    average_true[i, n] <- mean(True_values, na.rm = TRUE)
    average_expected[i, n] <- mean(Expected_values, na.rm = TRUE)
  }
}

# Calculate the overall average for each position across all simulations
overall_average_true <- rowMeans(average_true, na.rm = TRUE)
overall_average_expected <- rowMeans(average_expected, na.rm = TRUE)

# Plot the overall averages
plot(overall_average_true, type = "l", pch = 16, col = "blue", main = "Overall Average of True vs Expected Values", xlab = "Position in List", ylab = "Value", ylim = c(min(c(overall_average_true, overall_average_expected)), max(c(overall_average_true, overall_average_expected))))
lines(overall_average_expected, type = "l", pch = 16, col = "red")
legend("topright", legend = c("True Values", "Expected Values"), col = c("blue", "red"), lty = 1, cex = 0.8)

# Initialize matrices to store averages for each position
average_bid <- matrix(NA, nrow = 100, ncol = 10)
average_ask <- matrix(NA, nrow = 100, ncol = 10)

# Loop through each simulation (n)
for (n in 1:10) {
  # Extract True values from the aggregated_results_4 dataframe
  Bids_set2 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_2[n, 4])), ", ")
  
  # Extract Expected values from the aggregated_results_4 dataframe
  Asks_set2 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_2[n, 5])), ", ")
  
  # Loop through each position (i)
  for (i in 1:100) {
    # Extract True and Expected values for the i-th position
    Bids <- sapply(Bids_set2, function(x) as.numeric(x[i]))
    Asks <- sapply(Asks_set2, function(x) as.numeric(x[i]))
    
    # Calculate the average of True and Expected values for the i-th position
    average_bid[i, n] <- mean(Bids, na.rm = TRUE)
    average_ask[i, n] <- mean(Asks, na.rm = TRUE)
  }
}

# Calculate the overall average for each position across all simulations
overall_average_bid <- rowMeans(average_bid, na.rm = TRUE)
overall_average_ask <- rowMeans(average_ask, na.rm = TRUE)

# Plot the overall averages
plot(overall_average_bid, type = "l", pch = 16, col = "blue", main = "Overall Average of Bids vs Asks", xlab = "Position in List", ylab = "Value", ylim = c(min(c(overall_average_bid, overall_average_ask)), max(c(overall_average_bid, overall_average_ask))))
lines(overall_average_ask, type = "l", pch = 16, col = "red")
legend("topright", legend = c("Bids", "Asks"), col = c("blue", "red"), lty = 1, cex = 0.8)

# Initialize matrices to store averages for each position
average_bid <- matrix(NA, nrow = 100, ncol = 10)
average_ask <- matrix(NA, nrow = 100, ncol = 10)

# Loop through each simulation (n)
for (n in 1:10) {
  # Extract True values from the aggregated_results_4 dataframe
  Bids_set2 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_2[n, 4])), ", ")
  
  # Extract Expected values from the aggregated_results_4 dataframe
  Asks_set2 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_2[n, 5])), ", ")
  
  # Loop through each position (i)
  for (i in 1:100) {
    # Extract True and Expected values for the i-th position
    Bids <- sapply(Bids_set2, function(x) as.numeric(x[i]))
    Asks <- sapply(Asks_set2, function(x) as.numeric(x[i]))
    
    # Calculate the average of True and Expected values for the i-th position
    average_bid[i, n] <- mean(Bids, na.rm = TRUE)
    average_ask[i, n] <- mean(Asks, na.rm = TRUE)
  }
}

# Calculate the overall average for each position across all simulations
overall_average_bid <- rowMeans(average_bid, na.rm = TRUE)
overall_average_ask <- rowMeans(average_ask, na.rm = TRUE)

## True Value
# Initialize matrices to store averages for each position
average_true <- matrix(NA, nrow = 100, ncol = 10)
average_expected <- matrix(NA, nrow = 100, ncol = 10)

# Loop through each simulation (n)
for (n in 1:10) {
  # Extract True values from the aggregated_results_4 dataframe
  TrueValues_set2 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_2[n, 2])), ", ")
  
  # Extract Expected values from the aggregated_results_4 dataframe
  ExpectedValues_set2 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_2[n, 3])), ", ")
  
  # Loop through each position (i)
  for (i in 1:100) {
    # Extract True and Expected values for the i-th position
    True_values <- sapply(TrueValues_set2, function(x) as.numeric(x[i]))
    Expected_values <- sapply(ExpectedValues_set2, function(x) as.numeric(x[i]))
    
    # Calculate the average of True and Expected values for the i-th position
    average_true[i, n] <- mean(True_values, na.rm = TRUE)
    average_expected[i, n] <- mean(Expected_values, na.rm = TRUE)
  }
}

# Calculate the overall average for each position across all simulations
overall_average_true <- rowMeans(average_true, na.rm = TRUE)
overall_average_expected <- rowMeans(average_expected, na.rm = TRUE)

# Plot the overall averages
#plot(overall_average_true, type = "l", pch = 16, col = "blue", main = "Overall Average of True vs Expected Values", xlab = "Position in List", ylab = "Value", ylim = c(min(c(overall_average_true, overall_average_expected)), max(c(overall_average_true, overall_average_expected))))
#lines(overall_average_expected, type = "l", pch = 16, col = "red")
#legend("topright", legend = c("True Values", "Expected Values"), col = c("blue", "red"), lty = 1, cex = 0.8)

# Plot the overall averages
plot(overall_average_bid, type = "l", pch = 16, col = "blue", main = "Overall Average of Bids vs Asks & True vs Expected Values", xlab = "Position in List", ylab = "Value", ylim = c(min(c(overall_average_bid, overall_average_ask, overall_average_true, overall_average_expected)), max(c(overall_average_bid, overall_average_ask, overall_average_true, overall_average_expected))))
lines(overall_average_ask, type = "l", pch = 16, col = "red")
lines(overall_average_true, type = "l", pch = 16, col = "green")
lines(overall_average_expected, type = "l", pch = 16, col = "purple")
legend("bottomleft", legend = c("Bids", "Asks", "True Value", "Expected Value"), col = c("blue", "red", "green", "purple"), lty = 1, cex = 0.8)

# Initialize matrices to store averages for each position
average_MM_pnl <- matrix(NA, nrow = 100, ncol = 10)
average_Informed_pnl <- matrix(NA, nrow = 100, ncol = 10)
average_NoisyInformed_pnl <- matrix(NA, nrow = 100, ncol = 10)
average_Noisy_pnl <- matrix(NA, nrow = 100, ncol = 10)
average_StochNoisy_pnl <- matrix(NA, nrow = 100, ncol = 10)
average_mr_pnl <- matrix(NA, nrow = 100, ncol = 10)
average_mom_pnl <- matrix(NA, nrow = 100, ncol = 10)

# Loop through each simulation (n)
for (n in 1:10) {

  MM_pnl_set2 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_2[n, 6])), ", ")

  Informed_pnl_set2 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_2[n, 8])), ", ")
  
  NoisyInformed_pnl_set2 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_2[n, 10])), ", ")
  
  Noisy_pnl_set2 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_2[n, 12])), ", ")
  
  StochNoisy_pnl_set2 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_2[n, 14])), ", ")
  
  mr_pnl_set2 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_2[n, 16])), ", ")
  
  mom_pnl_set2 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_2[n, 18])), ", ")
  
  # Loop through each position (i)
  for (i in 1:100) {
    # Extract True and Expected values for the i-th position
    MM_pnl <- sapply(MM_pnl_set2, function(x) as.numeric(x[i]))
    Informed_pnl <- sapply(Informed_pnl_set2, function(x) as.numeric(x[i]))
    NoisyInformed_pnl <- sapply(NoisyInformed_pnl_set2, function(x) as.numeric(x[i]))
    Noisy_pnl <- sapply(Noisy_pnl_set2, function(x) as.numeric(x[i]))
    StochNoisy_pnl <- sapply(StochNoisy_pnl_set2, function(x) as.numeric(x[i]))
    mr_pnl <- sapply(mr_pnl_set2, function(x) as.numeric(x[i]))
    mom_pnl <- sapply(mom_pnl_set2, function(x) as.numeric(x[i]))
    
    # Calculate the average of True and Expected values for the i-th position
    average_MM_pnl[i, n] <- mean(MM_pnl, na.rm = TRUE)
    average_Informed_pnl[i, n] <- mean(Informed_pnl, na.rm = TRUE)
    average_NoisyInformed_pnl[i, n] <- mean(NoisyInformed_pnl, na.rm = TRUE)
    average_Noisy_pnl[i, n] <- mean(Noisy_pnl, na.rm = TRUE)
    average_StochNoisy_pnl[i, n] <- mean(StochNoisy_pnl, na.rm = TRUE)
    average_mr_pnl[i, n] <- mean(mr_pnl, na.rm = TRUE)
    average_mom_pnl[i, n] <- mean(mom_pnl, na.rm = TRUE)
  }
}

# Calculate the overall average for each position across all simulations
overall_average_MM_pnl <- rowMeans(average_MM_pnl, na.rm = TRUE)
overall_average_Informed_pnl <- rowMeans(average_Informed_pnl, na.rm = TRUE)
overall_average_NoisyInformed_pnl <- rowMeans(average_NoisyInformed_pnl, na.rm = TRUE)
overall_average_Noisy_pnl <- rowMeans(average_Noisy_pnl, na.rm = TRUE)
overall_average_StochNoisy_pnl <- rowMeans(average_StochNoisy_pnl, na.rm = TRUE)
overall_average_mr_pnl <- rowMeans(average_mr_pnl, na.rm = TRUE)
overall_average_mom_pnl <- rowMeans(average_mom_pnl, na.rm = TRUE)

# Plot the overall averages
plot(overall_average_MM_pnl, type = "l", pch = 16, col = "black", main = "Overall Average PNL", xlab = "Position in List", ylab = "Value", ylim = c(min(c(overall_average_MM_pnl, overall_average_Informed_pnl, overall_average_NoisyInformed_pnl, overall_average_Noisy_pnl, overall_average_StochNoisy_pnl, overall_average_mr_pnl, overall_average_mom_pnl)), max(c(overall_average_MM_pnl, overall_average_Informed_pnl, overall_average_NoisyInformed_pnl, overall_average_Noisy_pnl, overall_average_StochNoisy_pnl, overall_average_mr_pnl, overall_average_mom_pnl))))
lines(overall_average_Informed_pnl, type = "l", pch = 16, col = "red")
lines(overall_average_NoisyInformed_pnl, type = "l", pch = 16, col = "green")
lines(overall_average_Noisy_pnl, type = "l", pch = 16, col = "yellow")
lines(overall_average_StochNoisy_pnl, type = "l", pch = 16, col = "blue")
lines(overall_average_mr_pnl, type = "l", pch = 16, col = "purple")
lines(overall_average_mom_pnl, type = "l", pch = 16, col = "orange")

# Add legend
legend("bottomleft", legend = c("Market Maker", "Informed", "Noisy Informed", "Noisy", "Stochastic Noisy", "Mean Reversion", "Momentum"), col = c("black", "red", "green", "yellow", "blue", "purple", "orange"), lty = 1, cex = 0.8)

# Initialize matrices to store averages for each position
average_MM_pos <- matrix(NA, nrow = 100, ncol = 10)
average_Informed_pos <- matrix(NA, nrow = 100, ncol = 10)
average_NoisyInformed_pos <- matrix(NA, nrow = 100, ncol = 10)
average_Noisy_pos <- matrix(NA, nrow = 100, ncol = 10)
average_StochNoisy_pos <- matrix(NA, nrow = 100, ncol = 10)
average_mr_pos <- matrix(NA, nrow = 100, ncol = 10)
average_mom_pos <- matrix(NA, nrow = 100, ncol = 10)

# Loop through each simulation (n)
for (n in 1:10) {

  MM_pos_set2 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_2[n, 7])), ", ")

  Informed_pos_set2 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_2[n, 9])), ", ")
  
  NoisyInformed_pos_set2 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_2[n, 11])), ", ")
  
  Noisy_pos_set2 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_2[n, 13])), ", ")
  
  StochNoisy_pos_set2 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_2[n, 15])), ", ")
  
  mr_pos_set2 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_2[n, 17])), ", ")
  
  mom_pos_set2 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_2[n, 19])), ", ")
  
  # Loop through each position (i)
  for (i in 1:100) {
    # Extract True and Expected values for the i-th position
    MM_pos <- sapply(MM_pos_set2, function(x) as.numeric(x[i]))
    Informed_pos <- sapply(Informed_pos_set2, function(x) as.numeric(x[i]))
    NoisyInformed_pos <- sapply(NoisyInformed_pos_set2, function(x) as.numeric(x[i]))
    Noisy_pos <- sapply(Noisy_pos_set2, function(x) as.numeric(x[i]))
    StochNoisy_pos <- sapply(StochNoisy_pos_set2, function(x) as.numeric(x[i]))
    mr_pos <- sapply(mr_pos_set2, function(x) as.numeric(x[i]))
    mom_pos <- sapply(mom_pos_set2, function(x) as.numeric(x[i]))
    
    # Calculate the average of True and Expected values for the i-th position
    average_MM_pos[i, n] <- mean(MM_pos, na.rm = TRUE)
    average_Informed_pos[i, n] <- mean(Informed_pos, na.rm = TRUE)
    average_NoisyInformed_pos[i, n] <- mean(NoisyInformed_pos, na.rm = TRUE)
    average_Noisy_pos[i, n] <- mean(Noisy_pos, na.rm = TRUE)
    average_StochNoisy_pos[i, n] <- mean(StochNoisy_pos, na.rm = TRUE)
    average_mr_pos[i, n] <- mean(mr_pos, na.rm = TRUE)
    average_mom_pos[i, n] <- mean(mom_pos, na.rm = TRUE)
  }
}

# Calculate the overall average for each position across all simulations
overall_average_MM_pos <- rowMeans(average_MM_pos, na.rm = TRUE)
overall_average_Informed_pos <- rowMeans(average_Informed_pos, na.rm = TRUE)
overall_average_NoisyInformed_pos <- rowMeans(average_NoisyInformed_pos, na.rm = TRUE)
overall_average_Noisy_pos <- rowMeans(average_Noisy_pos, na.rm = TRUE)
overall_average_StochNoisy_pos <- rowMeans(average_StochNoisy_pos, na.rm = TRUE)
overall_average_mr_pos <- rowMeans(average_mr_pos, na.rm = TRUE)
overall_average_mom_pos <- rowMeans(average_mom_pos, na.rm = TRUE)

# Plot the overall averages
plot(overall_average_MM_pos, type = "l", pch = 16, col = "black", main = "Overall Average Position", xlab = "Position in List", ylab = "Value", ylim = c(min(c(overall_average_MM_pos, overall_average_Informed_pos, overall_average_NoisyInformed_pos, overall_average_Noisy_pos, overall_average_StochNoisy_pos, overall_average_mr_pos, overall_average_mom_pos)), max(c(overall_average_MM_pos, overall_average_Informed_pos, overall_average_NoisyInformed_pos, overall_average_Noisy_pos, overall_average_StochNoisy_pos, overall_average_mr_pos, overall_average_mom_pos))))
lines(overall_average_Informed_pos, type = "l", pch = 16, col = "red")
lines(overall_average_NoisyInformed_pos, type = "l", pch = 16, col = "green")
lines(overall_average_Noisy_pos, type = "l", pch = 16, col = "yellow")
lines(overall_average_StochNoisy_pos, type = "l", pch = 16, col = "blue")
lines(overall_average_mr_pos, type = "l", pch = 16, col = "purple")
lines(overall_average_mom_pos, type = "l", pch = 16, col = "orange")

# Add legend
legend("bottomleft", legend = c("Market Maker", "Informed", "Noisy Informed", "Noisy", "Stochastic Noisy", "Mean Reversion", "Momentum"), col = c("black", "red", "green", "yellow", "blue", "purple", "orange"), lty = 1, cex = 0.8)

set 3 (2 stochastic noisy + 2 mr + 2 mom)

# Initialize matrices to store averages for each position
average_true <- matrix(NA, nrow = 100, ncol = 10)
average_expected <- matrix(NA, nrow = 100, ncol = 10)

# Loop through each simulation (n)
for (n in 1:10) {
  # Extract True values from the aggregated_results_4 dataframe
  TrueValues_set3 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_3[n, 2])), ", ")
  
  # Extract Expected values from the aggregated_results_4 dataframe
  ExpectedValues_set3 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_3[n, 3])), ", ")
  
  # Loop through each position (i)
  for (i in 1:100) {
    # Extract True and Expected values for the i-th position
    True_values <- sapply(TrueValues_set3, function(x) as.numeric(x[i]))
    Expected_values <- sapply(ExpectedValues_set3, function(x) as.numeric(x[i]))
    
    # Calculate the average of True and Expected values for the i-th position
    average_true[i, n] <- mean(True_values, na.rm = TRUE)
    average_expected[i, n] <- mean(Expected_values, na.rm = TRUE)
  }
}

# Calculate the overall average for each position across all simulations
overall_average_true <- rowMeans(average_true, na.rm = TRUE)
overall_average_expected <- rowMeans(average_expected, na.rm = TRUE)

# Plot the overall averages
plot(overall_average_true, type = "l", pch = 16, col = "blue", main = "Overall Average of True vs Expected Values", xlab = "Position in List", ylab = "Value", ylim = c(min(c(overall_average_true, overall_average_expected)), max(c(overall_average_true, overall_average_expected))))
lines(overall_average_expected, type = "l", pch = 16, col = "red")
legend("topright", legend = c("True Values", "Expected Values"), col = c("blue", "red"), lty = 1, cex = 0.8)

# Initialize matrices to store averages for each position
average_bid <- matrix(NA, nrow = 100, ncol = 10)
average_ask <- matrix(NA, nrow = 100, ncol = 10)

# Loop through each simulation (n)
for (n in 1:10) {
  # Extract True values from the aggregated_results_4 dataframe
  Bids_set3 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_3[n, 4])), ", ")
  
  # Extract Expected values from the aggregated_results_4 dataframe
  Asks_set3 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_3[n, 5])), ", ")
  
  # Loop through each position (i)
  for (i in 1:100) {
    # Extract True and Expected values for the i-th position
    Bids <- sapply(Bids_set3, function(x) as.numeric(x[i]))
    Asks <- sapply(Asks_set3, function(x) as.numeric(x[i]))
    
    # Calculate the average of True and Expected values for the i-th position
    average_bid[i, n] <- mean(Bids, na.rm = TRUE)
    average_ask[i, n] <- mean(Asks, na.rm = TRUE)
  }
}

# Calculate the overall average for each position across all simulations
overall_average_bid <- rowMeans(average_bid, na.rm = TRUE)
overall_average_ask <- rowMeans(average_ask, na.rm = TRUE)

# Plot the overall averages
plot(overall_average_bid, type = "l", pch = 16, col = "blue", main = "Overall Average of Bids vs Asks", xlab = "Position in List", ylab = "Value", ylim = c(min(c(overall_average_bid, overall_average_ask)), max(c(overall_average_bid, overall_average_ask))))
lines(overall_average_ask, type = "l", pch = 16, col = "red")
legend("topright", legend = c("Bids", "Asks"), col = c("blue", "red"), lty = 1, cex = 0.8)

# Initialize matrices to store averages for each position
average_bid <- matrix(NA, nrow = 100, ncol = 10)
average_ask <- matrix(NA, nrow = 100, ncol = 10)

# Loop through each simulation (n)
for (n in 1:10) {
  # Extract True values from the aggregated_results_4 dataframe
  Bids_set3 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_3[n, 4])), ", ")
  
  # Extract Expected values from the aggregated_results_4 dataframe
  Asks_set3 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_3[n, 5])), ", ")
  
  # Loop through each position (i)
  for (i in 1:100) {
    # Extract True and Expected values for the i-th position
    Bids <- sapply(Bids_set3, function(x) as.numeric(x[i]))
    Asks <- sapply(Asks_set3, function(x) as.numeric(x[i]))
    
    # Calculate the average of True and Expected values for the i-th position
    average_bid[i, n] <- mean(Bids, na.rm = TRUE)
    average_ask[i, n] <- mean(Asks, na.rm = TRUE)
  }
}

# Calculate the overall average for each position across all simulations
overall_average_bid <- rowMeans(average_bid, na.rm = TRUE)
overall_average_ask <- rowMeans(average_ask, na.rm = TRUE)

## True Value
# Initialize matrices to store averages for each position
average_true <- matrix(NA, nrow = 100, ncol = 10)
average_expected <- matrix(NA, nrow = 100, ncol = 10)

# Loop through each simulation (n)
for (n in 1:10) {
  # Extract True values from the aggregated_results_4 dataframe
  TrueValues_set3 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_3[n, 2])), ", ")
  
  # Extract Expected values from the aggregated_results_4 dataframe
  ExpectedValues_set3 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_3[n, 3])), ", ")
  
  # Loop through each position (i)
  for (i in 1:100) {
    # Extract True and Expected values for the i-th position
    True_values <- sapply(TrueValues_set3, function(x) as.numeric(x[i]))
    Expected_values <- sapply(ExpectedValues_set3, function(x) as.numeric(x[i]))
    
    # Calculate the average of True and Expected values for the i-th position
    average_true[i, n] <- mean(True_values, na.rm = TRUE)
    average_expected[i, n] <- mean(Expected_values, na.rm = TRUE)
  }
}

# Calculate the overall average for each position across all simulations
overall_average_true <- rowMeans(average_true, na.rm = TRUE)
overall_average_expected <- rowMeans(average_expected, na.rm = TRUE)

# Plot the overall averages
#plot(overall_average_true, type = "l", pch = 16, col = "blue", main = "Overall Average of True vs Expected Values", xlab = "Position in List", ylab = "Value", ylim = c(min(c(overall_average_true, overall_average_expected)), max(c(overall_average_true, overall_average_expected))))
#lines(overall_average_expected, type = "l", pch = 16, col = "red")
#legend("topright", legend = c("True Values", "Expected Values"), col = c("blue", "red"), lty = 1, cex = 0.8)

# Plot the overall averages
plot(overall_average_bid, type = "l", pch = 16, col = "blue", main = "Overall Average of Bids vs Asks & True vs Expected Values", xlab = "Position in List", ylab = "Value", ylim = c(min(c(overall_average_bid, overall_average_ask, overall_average_true, overall_average_expected)), max(c(overall_average_bid, overall_average_ask, overall_average_true, overall_average_expected))))
lines(overall_average_ask, type = "l", pch = 16, col = "red")
lines(overall_average_true, type = "l", pch = 16, col = "green")
lines(overall_average_expected, type = "l", pch = 16, col = "purple")
legend("bottomleft", legend = c("Bids", "Asks", "True Value", "Expected Value"), col = c("blue", "red", "green", "purple"), lty = 1, cex = 0.8)

# Initialize matrices to store averages for each position
average_MM_pnl <- matrix(NA, nrow = 100, ncol = 10)
average_StochNoisy1_pnl <- matrix(NA, nrow = 100, ncol = 10)
average_StochNoisy2_pnl <- matrix(NA, nrow = 100, ncol = 10)
average_mr1_pnl <- matrix(NA, nrow = 100, ncol = 10)
average_mr2_pnl <- matrix(NA, nrow = 100, ncol = 10)
average_mom1_pnl <- matrix(NA, nrow = 100, ncol = 10)
average_mom2_pnl <- matrix(NA, nrow = 100, ncol = 10)

# Loop through each simulation (n)
for (n in 1:10) {

  MM_pnl_set3 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_3[n, 6])), ", ")

  StochNoisy1_pnl_set3 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_3[n, 8])), ", ")
  
  StochNoisy2_pnl_set3 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_3[n, 10])), ", ")
  
  mr1_pnl_set3 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_3[n, 12])), ", ")
  
  mr2_pnl_set3 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_3[n, 14])), ", ")
  
  mom1_pnl_set3 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_3[n, 16])), ", ")
  
  mom2_pnl_set3 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_3[n, 18])), ", ")
  
  # Loop through each position (i)
  for (i in 1:100) {
    # Extract True and Expected values for the i-th position
    MM_pnl <- sapply(MM_pnl_set3, function(x) as.numeric(x[i]))
    StochNoisy1_pnl <- sapply(StochNoisy1_pnl_set3, function(x) as.numeric(x[i]))
    StochNoisy2_pnl <- sapply(StochNoisy2_pnl_set3, function(x) as.numeric(x[i]))
    mr1_pnl <- sapply(mr1_pnl_set3, function(x) as.numeric(x[i]))
    mr2_pnl <- sapply(mr2_pnl_set3, function(x) as.numeric(x[i]))
    mom1_pnl <- sapply(mom1_pnl_set3, function(x) as.numeric(x[i]))
    mom2_pnl <- sapply(mom2_pnl_set3, function(x) as.numeric(x[i]))
    
    # Calculate the average of True and Expected values for the i-th position
    average_MM_pnl[i, n] <- mean(MM_pnl, na.rm = TRUE)
    average_StochNoisy1_pnl[i, n] <- mean(StochNoisy1_pnl, na.rm = TRUE)
    average_StochNoisy2_pnl[i, n] <- mean(StochNoisy2_pnl, na.rm = TRUE)
    average_mr1_pnl[i, n] <- mean(mr1_pnl, na.rm = TRUE)
    average_mr2_pnl[i, n] <- mean(mr2_pnl, na.rm = TRUE)
    average_mom1_pnl[i, n] <- mean(mom1_pnl, na.rm = TRUE)
    average_mom2_pnl[i, n] <- mean(mom2_pnl, na.rm = TRUE)
  }
}

# Calculate the overall average for each position across all simulations
overall_average_MM_pnl <- rowMeans(average_MM_pnl, na.rm = TRUE)
overall_average_StochNoisy1_pnl <- rowMeans(average_StochNoisy1_pnl, na.rm = TRUE)
overall_average_StochNoisy2_pnl <- rowMeans(average_StochNoisy2_pnl, na.rm = TRUE)
overall_average_mr1_pnl <- rowMeans(average_mr1_pnl, na.rm = TRUE)
overall_average_mr2_pnl <- rowMeans(average_mr2_pnl, na.rm = TRUE)
overall_average_mom1_pnl <- rowMeans(average_mom1_pnl, na.rm = TRUE)
overall_average_mom2_pnl <- rowMeans(average_mom2_pnl, na.rm = TRUE)

# Plot the overall averages
plot(overall_average_MM_pnl, type = "l", pch = 16, col = "black", main = "Overall Average PNL", xlab = "Position in List", ylab = "Value", ylim = c(min(c(overall_average_MM_pnl, overall_average_StochNoisy1_pnl, overall_average_StochNoisy2_pnl, overall_average_mr1_pnl, overall_average_mr2_pnl, overall_average_mom1_pnl, overall_average_mom2_pnl)), max(c(overall_average_MM_pnl, overall_average_StochNoisy1_pnl, overall_average_StochNoisy2_pnl, overall_average_mr1_pnl, overall_average_mr2_pnl, overall_average_mom1_pnl, overall_average_mom2_pnl))))
lines(overall_average_StochNoisy1_pnl, type = "l", pch = 16, col = "red")
lines(overall_average_StochNoisy2_pnl, type = "l", pch = 16, col = "green")
lines(overall_average_mr1_pnl, type = "l", pch = 16, col = "yellow")
lines(overall_average_mr2_pnl, type = "l", pch = 16, col = "blue")
lines(overall_average_mom1_pnl, type = "l", pch = 16, col = "purple")
lines(overall_average_mom2_pnl, type = "l", pch = 16, col = "orange")

# Add legend
legend("topleft", legend = c("Market Maker", "Stochastic Noisy 1", "Stochastic Noisy 2", "Mean Reversion 1", "Mean Reversion 2", "Momentum 1", "Momentum 2"), col = c("black", "red", "green", "yellow", "blue", "purple", "orange"), lty = 1, cex = 0.8)

# Initialize matrices to store averages for each position
average_MM_pos <- matrix(NA, nrow = 100, ncol = 10)
average_StochNoisy1_pos <- matrix(NA, nrow = 100, ncol = 10)
average_StochNoisy2_pos <- matrix(NA, nrow = 100, ncol = 10)
average_mr1_pos <- matrix(NA, nrow = 100, ncol = 10)
average_mr2_pos <- matrix(NA, nrow = 100, ncol = 10)
average_mom1_pos <- matrix(NA, nrow = 100, ncol = 10)
average_mom2_pos <- matrix(NA, nrow = 100, ncol = 10)

# Loop through each simulation (n)
for (n in 1:10) {

  MM_pos_set3 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_3[n, 7])), ", ")

  StochNoisy1_pos_set3 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_3[n, 9])), ", ")
  
  StochNoisy2_pos_set3 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_3[n, 11])), ", ")
  
  mr1_pos_set3 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_3[n, 12])), ", ")
  
  mr2_pos_set3 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_3[n, 15])), ", ")
  
  mom1_pos_set3 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_3[n, 17])), ", ")
  
  mom2_pos_set3 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_3[n, 19])), ", ")
  
  # Loop through each position (i)
  for (i in 1:100) {
    # Extract True and Expected values for the i-th position
    MM_pos <- sapply(MM_pos_set3, function(x) as.numeric(x[i]))
    StochNoisy1_pos <- sapply(StochNoisy1_pos_set3, function(x) as.numeric(x[i]))
    StochNoisy2_pos <- sapply(StochNoisy2_pos_set3, function(x) as.numeric(x[i]))
    mr1_pos <- sapply(mr1_pos_set3, function(x) as.numeric(x[i]))
    mr2_pos <- sapply(mr2_pos_set3, function(x) as.numeric(x[i]))
    mom1_pos <- sapply(mom1_pos_set3, function(x) as.numeric(x[i]))
    mom2_pos <- sapply(mom2_pos_set3, function(x) as.numeric(x[i]))
    
    # Calculate the average of True and Expected values for the i-th position
    average_MM_pos[i, n] <- mean(MM_pos, na.rm = TRUE)
    average_StochNoisy1_pos[i, n] <- mean(StochNoisy1_pos, na.rm = TRUE)
    average_StochNoisy2_pos[i, n] <- mean(StochNoisy2_pos, na.rm = TRUE)
    average_mr1_pos[i, n] <- mean(mr1_pos, na.rm = TRUE)
    average_mr2_pos[i, n] <- mean(mr2_pos, na.rm = TRUE)
    average_mom1_pos[i, n] <- mean(mom1_pos, na.rm = TRUE)
    average_mom2_pos[i, n] <- mean(mom2_pos, na.rm = TRUE)
  }
}

# Calculate the overall average for each position across all simulations
overall_average_MM_pos <- rowMeans(average_MM_pos, na.rm = TRUE)
overall_average_StochNoisy1_pos <- rowMeans(average_StochNoisy1_pos, na.rm = TRUE)
overall_average_StochNoisy2_pos <- rowMeans(average_StochNoisy2_pos, na.rm = TRUE)
overall_average_mr1_pos <- rowMeans(average_mr1_pos, na.rm = TRUE)
overall_average_mr2_pos <- rowMeans(average_mr2_pos, na.rm = TRUE)
overall_average_mom1_pos <- rowMeans(average_mom1_pos, na.rm = TRUE)
overall_average_mom2_pos <- rowMeans(average_mom2_pos, na.rm = TRUE)

# Plot the overall averages
plot(overall_average_MM_pos, type = "l", pch = 16, col = "black", main = "Overall Average Position", xlab = "Position in List", ylab = "Value", ylim = c(min(c(overall_average_MM_pos, overall_average_StochNoisy1_pos, overall_average_StochNoisy2_pos, overall_average_mr1_pos, overall_average_mr2_pos, overall_average_mom1_pos, overall_average_mom2_pos)), max(c(overall_average_MM_pos, overall_average_StochNoisy1_pos, overall_average_StochNoisy2_pos, overall_average_mr1_pos, overall_average_mr2_pos, overall_average_mom1_pos, overall_average_mom2_pos))))
lines(overall_average_StochNoisy1_pos, type = "l", pch = 16, col = "red")
lines(overall_average_StochNoisy2_pos, type = "l", pch = 16, col = "green")
lines(overall_average_mr1_pos, type = "l", pch = 16, col = "yellow")
lines(overall_average_mr2_pos, type = "l", pch = 16, col = "blue")
lines(overall_average_mom1_pos, type = "l", pch = 16, col = "purple")
lines(overall_average_mom2_pos, type = "l", pch = 16, col = "orange")

# Add legend
legend("topleft", legend = c("Market Maker", "Stochastic Noisy 1", "Stochastic Noisy 2", "Mean Reversion 1", "Mean Reversion 2", "Momentum 1", "Momentum 2"), col = c("black", "red", "green", "yellow", "blue", "purple", "orange"), lty = 1, cex = 0.8)

set 4 (1 informed + 2 noisy informed + 2 noisy + 1 stochastic noisy)

# Initialize empty vectors to store true and expected values
TrueValues_set4 <- numeric()
ExpectedValues_set4 <- numeric()

# Loop through each iteration (n)
for (n in 1:10) {
  # Extract True values from the aggregated_results_1 dataframe
  TrueValue_set4 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_4[n, 2])), ", ")[[1]]
  
  # Extract Expected values from the aggregated_results_1 dataframe
  ExpectedValue_set4 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_4[n, 3])), ", ")[[1]]
  
  # Append the True and Expected values to their respective vectors
  TrueValues_set4 <- c(TrueValues_set4, as.numeric(TrueValue_set4))
  ExpectedValues_set4 <- c(ExpectedValues_set4, as.numeric(ExpectedValue_set4))
}

# Calculate the average of True values
average_true <- mean(TrueValues_set4)

# Calculate the average of Expected values
average_expected <- mean(ExpectedValues_set4)

# Plot True and Expected values on the same plot
plot(TrueValues_set4, type = "l", pch = 16, col = "blue", main = "True vs Expected Values in set 4", xlab = "Iteration", ylab = "Value")
lines(ExpectedValues_set4, type = "l", pch = 16, col = "red")

# Add legend
legend("topright", legend = c("True Values", "Expected Values"), col = c("blue", "red"), lty = 1, cex = 0.8)

# Add horizontal lines for the averages
abline(h = average_true, col = "blue", lwd = 1)
abline(h = average_expected, col = "red", lwd = 1)

# Initialize matrices to store averages for each position
average_true <- matrix(NA, nrow = 100, ncol = 10)
average_expected <- matrix(NA, nrow = 100, ncol = 10)

# Loop through each simulation (n)
for (n in 1:10) {
  # Extract True values from the aggregated_results_4 dataframe
  TrueValues_set4 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_4[n, 2])), ", ")
  
  # Extract Expected values from the aggregated_results_4 dataframe
  ExpectedValues_set4 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_4[n, 3])), ", ")
  
  # Loop through each position (i)
  for (i in 1:100) {
    # Extract True and Expected values for the i-th position
    True_values <- sapply(TrueValues_set4, function(x) as.numeric(x[i]))
    Expected_values <- sapply(ExpectedValues_set4, function(x) as.numeric(x[i]))
    
    # Calculate the average of True and Expected values for the i-th position
    average_true[i, n] <- mean(True_values, na.rm = TRUE)
    average_expected[i, n] <- mean(Expected_values, na.rm = TRUE)
  }
}

# Calculate the overall average for each position across all simulations
overall_average_true <- rowMeans(average_true, na.rm = TRUE)
overall_average_expected <- rowMeans(average_expected, na.rm = TRUE)

# Plot the overall averages
plot(overall_average_true, type = "l", pch = 16, col = "blue", main = "Overall Average of True vs Expected Values", xlab = "Position in List", ylab = "Value", ylim = c(min(c(overall_average_true, overall_average_expected)), max(c(overall_average_true, overall_average_expected))))
lines(overall_average_expected, type = "l", pch = 16, col = "red")
legend("topright", legend = c("True Values", "Expected Values"), col = c("blue", "red"), lty = 1, cex = 0.8)

# Initialize empty vectors to store the Bid and Ask values
Bids_set4 <- numeric()
Asks_set4 <- numeric()

# Loop through each iteration (n)
for (n in 1:10) {
  # Extract Bid values from the aggregated_results_1 dataframe
  Bid_set4 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_4[n, 4])), ", ")[[1]]
  
  # Extract Ask values from the aggregated_results_1 dataframe (next column)
  Ask_set4 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_4[n, 5])), ", ")[[1]]
  
  # Append the Bid and Ask values to their respective vectors
  Bids_set4 <- c(Bids_set4, as.numeric(Bid_set4))
  Asks_set4 <- c(Asks_set4, as.numeric(Ask_set4))
}

# Calculate the average of Bid and Ask values
average_bids <- mean(Bids_set4, na.rm = TRUE)
average_asks <- mean(Asks_set4, na.rm = TRUE)

# Plot the Bid and Ask values on the same plot
plot(Bids_set4, type = "l", pch = 16, col = "blue", main = "Bids vs Asks in set 4", xlab = "Iteration", ylab = "Value", ylim = c(min(c(Bids_set4, Asks_set4)), max(c(Bids_set4, Asks_set4))))
lines(Asks_set4, type = "l", pch = 16, col = "red")

# Add legend
legend("topright", legend = c("Bids", "Asks"), col = c("blue", "red"), lty = 1, cex = 0.8)

# Add horizontal lines for the averages
abline(h = average_bids, col = "blue", lty = 1)
abline(h = average_asks, col = "red", lty = 1)

# Initialize matrices to store averages for each position
average_bid <- matrix(NA, nrow = 100, ncol = 10)
average_ask <- matrix(NA, nrow = 100, ncol = 10)

# Loop through each simulation (n)
for (n in 1:10) {
  # Extract True values from the aggregated_results_4 dataframe
  Bids_set4 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_4[n, 4])), ", ")
  
  # Extract Expected values from the aggregated_results_4 dataframe
  Asks_set4 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_4[n, 5])), ", ")
  
  # Loop through each position (i)
  for (i in 1:100) {
    # Extract True and Expected values for the i-th position
    Bids <- sapply(Bids_set4, function(x) as.numeric(x[i]))
    Asks <- sapply(Asks_set4, function(x) as.numeric(x[i]))
    
    # Calculate the average of True and Expected values for the i-th position
    average_bid[i, n] <- mean(Bids, na.rm = TRUE)
    average_ask[i, n] <- mean(Asks, na.rm = TRUE)
  }
}

# Calculate the overall average for each position across all simulations
overall_average_bid <- rowMeans(average_bid, na.rm = TRUE)
overall_average_ask <- rowMeans(average_ask, na.rm = TRUE)

# Plot the overall averages
plot(overall_average_bid, type = "l", pch = 16, col = "blue", main = "Overall Average of Bids vs Asks", xlab = "Position in List", ylab = "Value", ylim = c(min(c(overall_average_bid, overall_average_ask)), max(c(overall_average_bid, overall_average_ask))))
lines(overall_average_ask, type = "l", pch = 16, col = "red")
legend("topright", legend = c("Bids", "Asks"), col = c("blue", "red"), lty = 1, cex = 0.8)

# Initialize matrices to store averages for each position
average_bid <- matrix(NA, nrow = 100, ncol = 10)
average_ask <- matrix(NA, nrow = 100, ncol = 10)

# Loop through each simulation (n)
for (n in 1:10) {
  # Extract True values from the aggregated_results_4 dataframe
  Bids_set4 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_4[n, 4])), ", ")
  
  # Extract Expected values from the aggregated_results_4 dataframe
  Asks_set4 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_4[n, 5])), ", ")
  
  # Loop through each position (i)
  for (i in 1:100) {
    # Extract True and Expected values for the i-th position
    Bids <- sapply(Bids_set4, function(x) as.numeric(x[i]))
    Asks <- sapply(Asks_set4, function(x) as.numeric(x[i]))
    
    # Calculate the average of True and Expected values for the i-th position
    average_bid[i, n] <- mean(Bids, na.rm = TRUE)
    average_ask[i, n] <- mean(Asks, na.rm = TRUE)
  }
}

# Calculate the overall average for each position across all simulations
overall_average_bid <- rowMeans(average_bid, na.rm = TRUE)
overall_average_ask <- rowMeans(average_ask, na.rm = TRUE)

## True Value
# Initialize matrices to store averages for each position
average_true <- matrix(NA, nrow = 100, ncol = 10)
average_expected <- matrix(NA, nrow = 100, ncol = 10)

# Loop through each simulation (n)
for (n in 1:10) {
  # Extract True values from the aggregated_results_4 dataframe
  TrueValues_set4 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_4[n, 2])), ", ")
  
  # Extract Expected values from the aggregated_results_4 dataframe
  ExpectedValues_set4 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_4[n, 3])), ", ")
  
  # Loop through each position (i)
  for (i in 1:100) {
    # Extract True and Expected values for the i-th position
    True_values <- sapply(TrueValues_set4, function(x) as.numeric(x[i]))
    Expected_values <- sapply(ExpectedValues_set4, function(x) as.numeric(x[i]))
    
    # Calculate the average of True and Expected values for the i-th position
    average_true[i, n] <- mean(True_values, na.rm = TRUE)
    average_expected[i, n] <- mean(Expected_values, na.rm = TRUE)
  }
}

# Calculate the overall average for each position across all simulations
overall_average_true <- rowMeans(average_true, na.rm = TRUE)
overall_average_expected <- rowMeans(average_expected, na.rm = TRUE)

# Plot the overall averages
#plot(overall_average_true, type = "l", pch = 16, col = "blue", main = "Overall Average of True vs Expected Values", xlab = "Position in List", ylab = "Value", ylim = c(min(c(overall_average_true, overall_average_expected)), max(c(overall_average_true, overall_average_expected))))
#lines(overall_average_expected, type = "l", pch = 16, col = "red")
#legend("topright", legend = c("True Values", "Expected Values"), col = c("blue", "red"), lty = 1, cex = 0.8)

# Plot the overall averages
plot(overall_average_bid, type = "l", pch = 16, col = "blue", main = "Overall Average of Bids vs Asks & True vs Expected Values", xlab = "Position in List", ylab = "Value", ylim = c(min(c(overall_average_bid, overall_average_ask, overall_average_true, overall_average_expected)), max(c(overall_average_bid, overall_average_ask, overall_average_true, overall_average_expected))))
lines(overall_average_ask, type = "l", pch = 16, col = "red")
lines(overall_average_true, type = "l", pch = 16, col = "green")
lines(overall_average_expected, type = "l", pch = 16, col = "purple")
legend("bottomleft", legend = c("Bids", "Asks", "True Value", "Expected Value"), col = c("blue", "red", "green", "purple"), lty = 1, cex = 0.8)

# Initialize empty vectors to store the Bid and Ask values
MM_pnl_set4 <- numeric()
Informed_pnl_set4 <- numeric()
NoisyInformed1_pnl_set4 <- numeric()
NoisyInformed2_pnl_set4 <- numeric()
Noisy1_pnl_set4 <- numeric()
Noisy2_pnl_set4 <- numeric()
StochNoisy_pnl_set4 <- numeric()

# Loop through each iteration (n)
for (n in 1:10) {

  MM_pnl_values <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_4[n, 6])), ", ")[[1]]
  
  Informed_pnl_values <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_4[n, 8])), ", ")[[1]]
  
  NoisyInformed1_pnl_values <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_4[n, 10])), ", ")[[1]]
  
  NoisyInformed2_pnl_values <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_4[n, 12])), ", ")[[1]]
  
  Noisy1_pnl_values <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_4[n, 14])), ", ")[[1]]
  
  Noisy2_pnl_values <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_4[n, 16])), ", ")[[1]]
  
  StochNoisy_pnl_values <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_4[n, 18])), ", ")[[1]]
  
  # Convert Bid and Ask values to numeric and append to the vectors
  MM_pnl_set4 <- c(MM_pnl_set4, as.numeric(MM_pnl_values))
  Informed_pnl_set4 <- c(Informed_pnl_set4, as.numeric(Informed_pnl_values))
  NoisyInformed1_pnl_set4 <- c(NoisyInformed1_pnl_set4, as.numeric(NoisyInformed1_pnl_values))
  NoisyInformed2_pnl_set4 <- c(NoisyInformed2_pnl_set4, as.numeric(NoisyInformed2_pnl_values))
  Noisy1_pnl_set4 <- c(Noisy_pnl_set4, as.numeric(Noisy1_pnl_values))
  Noisy2_pnl_set4 <- c(Noisy2_pnl_set4, as.numeric(Noisy2_pnl_values))
  StochNoisy_pnl_set4 <- c(StochNoisy_pnl_set4, as.numeric(StochNoisy_pnl_values))
}

# Calculate the average of Bid and Ask values
#average_MM <- mean(MM_set4, na.rm = TRUE)
#average_IN <- mean(IN_set4, na.rm = TRUE)

# Plot the Bid and Ask values on the same plot
plot(MM_pnl_set4, type = "l", pch = 16, col = "black", main = "PNL in set 4", xlab = "Iteration", ylab = "Value", ylim = c(min(c(MM_pnl_set4, Informed_pnl_set4, NoisyInformed1_pnl_set4, NoisyInformed2_pnl_set4, Noisy1_pnl_set4, Noisy2_pnl_set4, StochNoisy_pnl_set4)), max(c(MM_pnl_set4, Informed_pnl_set4, NoisyInformed1_pnl_set4, NoisyInformed2_pnl_set4, Noisy1_pnl_set4, Noisy2_pnl_set4, StochNoisy_pnl_set4))))
lines(Informed_pnl_set4, type = "l", pch = 16, col = "red")
lines(NoisyInformed1_pnl_set4, type = "l", pch = 16, col = "green")
lines(NoisyInformed2_pnl_set4, type = "l", pch = 16, col = "yellow")
lines(Noisy1_pnl_set4, type = "l", pch = 16, col = "blue")
lines(Noisy2_pnl_set4, type = "l", pch = 16, col = "purple")
lines(StochNoisy_pnl_set4, type = "l", pch = 16, col = "orange")


# Add legend
legend("bottomright", legend = c("Market Maker", "Informed", "Noisy Informed 1", "Noisy Informed 2", "Noisy 1", "Noisy 2", "Stochastic Noisy"), col = c("black", "red", "green", "yellow", "blue", "purple", "orange"), lty = 1, cex = 0.8)


# Add horizontal lines for the averages
#abline(h = average_MM, col = "blue", lty = 1)
#abline(h = average_IN, col = "red", lty = 1)
# Initialize matrices to store averages for each position
average_MM_pnl <- matrix(NA, nrow = 100, ncol = 10)
average_Informed_pnl <- matrix(NA, nrow = 100, ncol = 10)
average_NoisyInformed1_pnl <- matrix(NA, nrow = 100, ncol = 10)
average_NoisyInformed2_pnl <- matrix(NA, nrow = 100, ncol = 10)
average_Noisy1_pnl <- matrix(NA, nrow = 100, ncol = 10)
average_Noisy2_pnl <- matrix(NA, nrow = 100, ncol = 10)
average_StochNoisy_pnl <- matrix(NA, nrow = 100, ncol = 10)

# Loop through each simulation (n)
for (n in 1:10) {

  MM_pnl_set4 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_4[n, 6])), ", ")

  Informed_pnl_set4 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_4[n, 8])), ", ")
  
  NoisyInformed1_pnl_set4 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_4[n, 10])), ", ")
  
  NoisyInformed2_pnl_set4 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_4[n, 12])), ", ")
  
  Noisy1_pnl_set4 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_4[n, 14])), ", ")
  
  Noisy2_pnl_set4 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_4[n, 16])), ", ")
  
  StochNoisy_pnl_set4 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_4[n, 18])), ", ")
  
  # Loop through each position (i)
  for (i in 1:100) {
    # Extract True and Expected values for the i-th position
    MM_pnl <- sapply(MM_pnl_set4, function(x) as.numeric(x[i]))
    Informed_pnl <- sapply(Informed_pnl_set4, function(x) as.numeric(x[i]))
    NoisyInformed1_pnl <- sapply(NoisyInformed1_pnl_set4, function(x) as.numeric(x[i]))
    NoisyInformed2_pnl <- sapply(NoisyInformed2_pnl_set4, function(x) as.numeric(x[i]))
    Noisy1_pnl <- sapply(Noisy1_pnl_set4, function(x) as.numeric(x[i]))
    Noisy2_pnl <- sapply(Noisy2_pnl_set4, function(x) as.numeric(x[i]))
    StochNoisy_pnl <- sapply(StochNoisy_pnl_set4, function(x) as.numeric(x[i]))
    
    # Calculate the average of True and Expected values for the i-th position
    average_MM_pnl[i, n] <- mean(MM_pnl, na.rm = TRUE)
    average_Informed_pnl[i, n] <- mean(Informed_pnl, na.rm = TRUE)
    average_NoisyInformed1_pnl[i, n] <- mean(NoisyInformed1_pnl, na.rm = TRUE)
    average_NoisyInformed2_pnl[i, n] <- mean(NoisyInformed2_pnl, na.rm = TRUE)
    average_Noisy1_pnl[i, n] <- mean(Noisy1_pnl, na.rm = TRUE)
    average_Noisy2_pnl[i, n] <- mean(Noisy2_pnl, na.rm = TRUE)
    average_StochNoisy_pnl[i, n] <- mean(StochNoisy_pnl, na.rm = TRUE)
  }
}

# Calculate the overall average for each position across all simulations
overall_average_MM_pnl <- rowMeans(average_MM_pnl, na.rm = TRUE)
overall_average_Informed_pnl <- rowMeans(average_Informed_pnl, na.rm = TRUE)
overall_average_NoisyInformed1_pnl <- rowMeans(average_NoisyInformed1_pnl, na.rm = TRUE)
overall_average_NoisyInformed2_pnl <- rowMeans(average_NoisyInformed2_pnl, na.rm = TRUE)
overall_average_Noisy1_pnl <- rowMeans(average_Noisy1_pnl, na.rm = TRUE)
overall_average_Noisy2_pnl <- rowMeans(average_Noisy2_pnl, na.rm = TRUE)
overall_average_StochNoisy_pnl <- rowMeans(average_StochNoisy_pnl, na.rm = TRUE)

# Plot the overall averages
plot(overall_average_MM_pnl, type = "l", pch = 16, col = "black", main = "Overall Average PNL", xlab = "Position in List", ylab = "Value", ylim = c(min(c(overall_average_MM_pnl, overall_average_Informed_pnl, overall_average_NoisyInformed1_pnl, overall_average_NoisyInformed2_pnl, overall_average_Noisy1_pnl, overall_average_Noisy2_pnl, overall_average_StochNoisy_pnl)), max(c(overall_average_MM_pnl, overall_average_Informed_pnl, overall_average_NoisyInformed1_pnl, overall_average_NoisyInformed2_pnl, overall_average_Noisy1_pnl, overall_average_Noisy2_pnl, overall_average_StochNoisy_pnl))))
lines(overall_average_Informed_pnl, type = "l", pch = 16, col = "red")
lines(overall_average_NoisyInformed1_pnl, type = "l", pch = 16, col = "green")
lines(overall_average_NoisyInformed2_pnl, type = "l", pch = 16, col = "yellow")
lines(overall_average_Noisy1_pnl, type = "l", pch = 16, col = "blue")
lines(overall_average_Noisy2_pnl, type = "l", pch = 16, col = "purple")
lines(overall_average_StochNoisy_pnl, type = "l", pch = 16, col = "orange")

# Add legend
legend("bottomleft", legend = c("Market Maker", "Informed", "Noisy Informed 1", "Noisy Informed 2", "Noisy 1", "Noisy 2", "Stochastic Noisy"), col = c("black", "red", "green", "yellow", "blue", "purple", "orange"), lty = 1, cex = 0.8)

# Initialize empty vectors to store the Bid and Ask values
MM_pos_set4 <- numeric()
Informed_pos_set4 <- numeric()
NoisyInformed1_pos_set4 <- numeric()
NoisyInformed2_pos_set4 <- numeric()
Noisy1_pos_set4 <- numeric()
Noisy2_pos_set4 <- numeric()
StochNoisy_pos_set4 <- numeric()

# Loop through each iteration (n)
for (n in 1:10) {

  MM_pos_values <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_4[n, 7])), ", ")[[1]]
  
  Informed_pos_values <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_4[n, 9])), ", ")[[1]]
  
  NoisyInformed1_pos_values <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_4[n, 11])), ", ")[[1]]
  
  NoisyInformed2_pos_values <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_4[n, 13])), ", ")[[1]]
  
  Noisy1_pos_values <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_4[n, 15])), ", ")[[1]]
  
  Noisy2_pos_values <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_4[n, 17])), ", ")[[1]]
  
  StochNoisy_pos_values <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_4[n, 19])), ", ")[[1]]
  
  # Convert Bid and Ask values to numeric and append to the vectors
  MM_pos_set4 <- c(MM_pos_set4, as.numeric(MM_pos_values))
  Informed_pos_set4 <- c(Informed_pos_set4, as.numeric(Informed_pos_values))
  NoisyInformed1_pos_set4 <- c(NoisyInformed1_pos_set4, as.numeric(NoisyInformed1_pos_values))
  NoisyInformed2_pos_set4 <- c(NoisyInformed2_pos_set4, as.numeric(NoisyInformed2_pos_values))
  Noisy1_pos_set4 <- c(Noisy_pos_set4, as.numeric(Noisy1_pos_values))
  Noisy2_pos_set4 <- c(Noisy2_pos_set4, as.numeric(Noisy2_pos_values))
  StochNoisy_pos_set4 <- c(StochNoisy_pos_set4, as.numeric(StochNoisy_pos_values))
}

# Calculate the average of Bid and Ask values
#average_MM <- mean(MM_set4, na.rm = TRUE)
#average_IN <- mean(IN_set4, na.rm = TRUE)

# Plot the Bid and Ask values on the same plot
plot(MM_pos_set4, type = "l", pch = 16, col = "black", main = "Position in set 4", xlab = "Iteration", ylab = "Value", ylim = c(min(c(MM_pos_set4, Informed_pos_set4, NoisyInformed1_pos_set4, NoisyInformed2_pos_set4, Noisy1_pos_set4, Noisy2_pos_set4, StochNoisy_pos_set4)), max(c(MM_pos_set4, Informed_pos_set4, NoisyInformed1_pos_set4, NoisyInformed2_pos_set4, Noisy1_pos_set4, Noisy2_pos_set4, StochNoisy_pos_set4))))
lines(Informed_pos_set4, type = "l", pch = 16, col = "red")
lines(NoisyInformed1_pos_set4, type = "l", pch = 16, col = "green")
lines(NoisyInformed2_pos_set4, type = "l", pch = 16, col = "yellow")
lines(Noisy1_pos_set4, type = "l", pch = 16, col = "blue")
lines(Noisy2_pos_set4, type = "l", pch = 16, col = "purple")
lines(StochNoisy_pos_set4, type = "l", pch = 16, col = "orange")


# Add legend
legend("topleft", legend = c("Market Maker", "Informed", "Noisy Informed 1", "Noisy Informed 2", "Noisy 1", "Noisy 2", "Stochastic Noisy"), col = c("black", "red", "green", "yellow", "blue", "purple", "orange"), lty = 1, cex = 0.8)


# Add horizontal lines for the averages
#abline(h = average_MM, col = "blue", lty = 1)
#abline(h = average_IN, col = "red", lty = 1)
# Initialize matrices to store averages for each position
average_MM_pos <- matrix(NA, nrow = 100, ncol = 10)
average_Informed_pos <- matrix(NA, nrow = 100, ncol = 10)
average_NoisyInformed1_pos <- matrix(NA, nrow = 100, ncol = 10)
average_NoisyInformed2_pos <- matrix(NA, nrow = 100, ncol = 10)
average_Noisy1_pos <- matrix(NA, nrow = 100, ncol = 10)
average_Noisy2_pos <- matrix(NA, nrow = 100, ncol = 10)
average_StochNoisy_pos <- matrix(NA, nrow = 100, ncol = 10)

# Loop through each simulation (n)
for (n in 1:10) {

  MM_pos_set4 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_4[n, 7])), ", ")

  Informed_pos_set4 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_4[n, 9])), ", ")
  
  NoisyInformed1_pos_set4 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_4[n, 11])), ", ")
  
  NoisyInformed2_pos_set4 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_4[n, 13])), ", ")
  
  Noisy1_pos_set4 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_4[n, 15])), ", ")
  
  Noisy2_pos_set4 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_4[n, 17])), ", ")
  
  StochNoisy_pos_set4 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_4[n, 19])), ", ")
  
  # Loop through each position (i)
  for (i in 1:100) {
    # Extract True and Expected values for the i-th position
    MM_pos <- sapply(MM_pos_set4, function(x) as.numeric(x[i]))
    Informed_pos <- sapply(Informed_pos_set4, function(x) as.numeric(x[i]))
    NoisyInformed1_pos <- sapply(NoisyInformed1_pos_set4, function(x) as.numeric(x[i]))
    NoisyInformed2_pos <- sapply(NoisyInformed2_pos_set4, function(x) as.numeric(x[i]))
    Noisy1_pos <- sapply(Noisy1_pos_set4, function(x) as.numeric(x[i]))
    Noisy2_pos <- sapply(Noisy2_pos_set4, function(x) as.numeric(x[i]))
    StochNoisy_pos <- sapply(StochNoisy_pos_set4, function(x) as.numeric(x[i]))
    
    # Calculate the average of True and Expected values for the i-th position
    average_MM_pos[i, n] <- mean(MM_pos, na.rm = TRUE)
    average_Informed_pos[i, n] <- mean(Informed_pos, na.rm = TRUE)
    average_NoisyInformed1_pos[i, n] <- mean(NoisyInformed1_pos, na.rm = TRUE)
    average_NoisyInformed2_pos[i, n] <- mean(NoisyInformed2_pos, na.rm = TRUE)
    average_Noisy1_pos[i, n] <- mean(Noisy1_pos, na.rm = TRUE)
    average_Noisy2_pos[i, n] <- mean(Noisy2_pos, na.rm = TRUE)
    average_StochNoisy_pos[i, n] <- mean(StochNoisy_pos, na.rm = TRUE)
  }
}

# Calculate the overall average for each position across all simulations
overall_average_MM_pos <- rowMeans(average_MM_pos, na.rm = TRUE)
overall_average_Informed_pos <- rowMeans(average_Informed_pos, na.rm = TRUE)
overall_average_NoisyInformed1_pos <- rowMeans(average_NoisyInformed1_pos, na.rm = TRUE)
overall_average_NoisyInformed2_pos <- rowMeans(average_NoisyInformed2_pos, na.rm = TRUE)
overall_average_Noisy1_pos <- rowMeans(average_Noisy1_pos, na.rm = TRUE)
overall_average_Noisy2_pos <- rowMeans(average_Noisy2_pos, na.rm = TRUE)
overall_average_StochNoisy_pos <- rowMeans(average_StochNoisy_pos, na.rm = TRUE)

# Plot the overall averages
plot(overall_average_MM_pos, type = "l", pch = 16, col = "black", main = "Overall Average Position", xlab = "Position in List", ylab = "Value", ylim = c(min(c(overall_average_MM_pos, overall_average_Informed_pos, overall_average_NoisyInformed1_pos, overall_average_NoisyInformed2_pos, overall_average_Noisy1_pos, overall_average_Noisy2_pos, overall_average_StochNoisy_pos)), max(c(overall_average_MM_pos, overall_average_Informed_pos, overall_average_NoisyInformed1_pos, overall_average_NoisyInformed2_pos, overall_average_Noisy1_pos, overall_average_Noisy2_pos, overall_average_StochNoisy_pos))))
lines(overall_average_Informed_pos, type = "l", pch = 16, col = "red")
lines(overall_average_NoisyInformed1_pos, type = "l", pch = 16, col = "green")
lines(overall_average_NoisyInformed2_pos, type = "l", pch = 16, col = "yellow")
lines(overall_average_Noisy1_pos, type = "l", pch = 16, col = "blue")
lines(overall_average_Noisy2_pos, type = "l", pch = 16, col = "purple")
lines(overall_average_StochNoisy_pos, type = "l", pch = 16, col = "orange")

# Add legend
legend("bottomleft", legend = c("Market Maker", "Informed", "Noisy Informed 1", "Noisy Informed 2", "Noisy 1", "Noisy 2", "Stochastic Noisy"), col = c("black", "red", "green", "yellow", "blue", "purple", "orange"), lty = 1, cex = 0.8)

set 4 with sigma = 0.25

# Initialize matrices to store averages for each position
average_MM_pnl <- matrix(NA, nrow = 100, ncol = 10)
average_Informed_pnl <- matrix(NA, nrow = 100, ncol = 10)
average_NoisyInformed1_pnl <- matrix(NA, nrow = 100, ncol = 10)
average_NoisyInformed2_pnl <- matrix(NA, nrow = 100, ncol = 10)
average_Noisy1_pnl <- matrix(NA, nrow = 100, ncol = 10)
average_Noisy2_pnl <- matrix(NA, nrow = 100, ncol = 10)
average_StochNoisy_pnl <- matrix(NA, nrow = 100, ncol = 10)

# Loop through each simulation (n)
for (n in 1:10) {

  MM_pnl_set4_0_25 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_4_0_25[n, 6])), ", ")

  Informed_pnl_set4_0_25 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_4_0_25[n, 8])), ", ")
  
  NoisyInformed1_pnl_set4_0_25 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_4_0_25[n, 10])), ", ")
  
  NoisyInformed2_pnl_set4_0_25 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_4_0_25[n, 12])), ", ")
  
  Noisy1_pnl_set4_0_25 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_4_0_25[n, 14])), ", ")
  
  Noisy2_pnl_set4_0_25 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_4_0_25[n, 16])), ", ")
  
  StochNoisy_pnl_set4_0_25 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_4_0_25[n, 18])), ", ")
  
  # Loop through each position (i)
  for (i in 1:100) {
    # Extract True and Expected values for the i-th position
    MM_pnl <- sapply(MM_pnl_set4_0_25, function(x) as.numeric(x[i]))
    Informed_pnl <- sapply(Informed_pnl_set4_0_25, function(x) as.numeric(x[i]))
    NoisyInformed1_pnl <- sapply(NoisyInformed1_pnl_set4_0_25, function(x) as.numeric(x[i]))
    NoisyInformed2_pnl <- sapply(NoisyInformed2_pnl_set4_0_25, function(x) as.numeric(x[i]))
    Noisy1_pnl <- sapply(Noisy1_pnl_set4_0_25, function(x) as.numeric(x[i]))
    Noisy2_pnl <- sapply(Noisy2_pnl_set4_0_25, function(x) as.numeric(x[i]))
    StochNoisy_pnl <- sapply(StochNoisy_pnl_set4_0_25, function(x) as.numeric(x[i]))
    
    # Calculate the average of True and Expected values for the i-th position
    average_MM_pnl[i, n] <- mean(MM_pnl, na.rm = TRUE)
    average_Informed_pnl[i, n] <- mean(Informed_pnl, na.rm = TRUE)
    average_NoisyInformed1_pnl[i, n] <- mean(NoisyInformed1_pnl, na.rm = TRUE)
    average_NoisyInformed2_pnl[i, n] <- mean(NoisyInformed2_pnl, na.rm = TRUE)
    average_Noisy1_pnl[i, n] <- mean(Noisy1_pnl, na.rm = TRUE)
    average_Noisy2_pnl[i, n] <- mean(Noisy2_pnl, na.rm = TRUE)
    average_StochNoisy_pnl[i, n] <- mean(StochNoisy_pnl, na.rm = TRUE)
  }
}

# Calculate the overall average for each position across all simulations
overall_average_MM_pnl <- rowMeans(average_MM_pnl, na.rm = TRUE)
overall_average_Informed_pnl <- rowMeans(average_Informed_pnl, na.rm = TRUE)
overall_average_NoisyInformed1_pnl <- rowMeans(average_NoisyInformed1_pnl, na.rm = TRUE)
overall_average_NoisyInformed2_pnl <- rowMeans(average_NoisyInformed2_pnl, na.rm = TRUE)
overall_average_Noisy1_pnl <- rowMeans(average_Noisy1_pnl, na.rm = TRUE)
overall_average_Noisy2_pnl <- rowMeans(average_Noisy2_pnl, na.rm = TRUE)
overall_average_StochNoisy_pnl <- rowMeans(average_StochNoisy_pnl, na.rm = TRUE)

# Plot the overall averages
plot(overall_average_MM_pnl, type = "l", pch = 16, col = "black", main = "Overall Average PNL (sigma = 0.25)", xlab = "Position in List", ylab = "Value", ylim = c(min(c(overall_average_MM_pnl, overall_average_Informed_pnl, overall_average_NoisyInformed1_pnl, overall_average_NoisyInformed2_pnl, overall_average_Noisy1_pnl, overall_average_Noisy2_pnl, overall_average_StochNoisy_pnl)), max(c(overall_average_MM_pnl, overall_average_Informed_pnl, overall_average_NoisyInformed1_pnl, overall_average_NoisyInformed2_pnl, overall_average_Noisy1_pnl, overall_average_Noisy2_pnl, overall_average_StochNoisy_pnl))))
lines(overall_average_Informed_pnl, type = "l", pch = 16, col = "red")
lines(overall_average_NoisyInformed1_pnl, type = "l", pch = 16, col = "green")
lines(overall_average_NoisyInformed2_pnl, type = "l", pch = 16, col = "yellow")
lines(overall_average_Noisy1_pnl, type = "l", pch = 16, col = "blue")
lines(overall_average_Noisy2_pnl, type = "l", pch = 16, col = "purple")
lines(overall_average_StochNoisy_pnl, type = "l", pch = 16, col = "orange")

# Add legend
legend("bottomleft", legend = c("Market Maker", "Informed", "Noisy Informed 1", "Noisy Informed 2", "Noisy 1", "Noisy 2", "Stochastic Noisy"), col = c("black", "red", "green", "yellow", "blue", "purple", "orange"), lty = 1, cex = 0.8)

set 4 with sigma = 0.75

# Initialize matrices to store averages for each position
average_MM_pnl <- matrix(NA, nrow = 100, ncol = 10)
average_Informed_pnl <- matrix(NA, nrow = 100, ncol = 10)
average_NoisyInformed1_pnl <- matrix(NA, nrow = 100, ncol = 10)
average_NoisyInformed2_pnl <- matrix(NA, nrow = 100, ncol = 10)
average_Noisy1_pnl <- matrix(NA, nrow = 100, ncol = 10)
average_Noisy2_pnl <- matrix(NA, nrow = 100, ncol = 10)
average_StochNoisy_pnl <- matrix(NA, nrow = 100, ncol = 10)

# Loop through each simulation (n)
for (n in 1:10) {

  MM_pnl_set4_0_75 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_4_0_75[n, 6])), ", ")

  Informed_pnl_set4_0_75 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_4_0_75[n, 8])), ", ")
  
  NoisyInformed1_pnl_set4_0_75 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_4_0_75[n, 10])), ", ")
  
  NoisyInformed2_pnl_set4_0_75 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_4_0_75[n, 12])), ", ")
  
  Noisy1_pnl_set4_0_75 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_4_0_75[n, 14])), ", ")
  
  Noisy2_pnl_set4_0_75 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_4_0_75[n, 16])), ", ")
  
  StochNoisy_pnl_set4_0_75 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_4_0_75[n, 18])), ", ")
  
  # Loop through each position (i)
  for (i in 1:100) {
    # Extract True and Expected values for the i-th position
    MM_pnl <- sapply(MM_pnl_set4_0_75, function(x) as.numeric(x[i]))
    Informed_pnl <- sapply(Informed_pnl_set4_0_75, function(x) as.numeric(x[i]))
    NoisyInformed1_pnl <- sapply(NoisyInformed1_pnl_set4_0_75, function(x) as.numeric(x[i]))
    NoisyInformed2_pnl <- sapply(NoisyInformed2_pnl_set4_0_75, function(x) as.numeric(x[i]))
    Noisy1_pnl <- sapply(Noisy1_pnl_set4_0_75, function(x) as.numeric(x[i]))
    Noisy2_pnl <- sapply(Noisy2_pnl_set4_0_75, function(x) as.numeric(x[i]))
    StochNoisy_pnl <- sapply(StochNoisy_pnl_set4_0_75, function(x) as.numeric(x[i]))
    
    # Calculate the average of True and Expected values for the i-th position
    average_MM_pnl[i, n] <- mean(MM_pnl, na.rm = TRUE)
    average_Informed_pnl[i, n] <- mean(Informed_pnl, na.rm = TRUE)
    average_NoisyInformed1_pnl[i, n] <- mean(NoisyInformed1_pnl, na.rm = TRUE)
    average_NoisyInformed2_pnl[i, n] <- mean(NoisyInformed2_pnl, na.rm = TRUE)
    average_Noisy1_pnl[i, n] <- mean(Noisy1_pnl, na.rm = TRUE)
    average_Noisy2_pnl[i, n] <- mean(Noisy2_pnl, na.rm = TRUE)
    average_StochNoisy_pnl[i, n] <- mean(StochNoisy_pnl, na.rm = TRUE)
  }
}

# Calculate the overall average for each position across all simulations
overall_average_MM_pnl <- rowMeans(average_MM_pnl, na.rm = TRUE)
overall_average_Informed_pnl <- rowMeans(average_Informed_pnl, na.rm = TRUE)
overall_average_NoisyInformed1_pnl <- rowMeans(average_NoisyInformed1_pnl, na.rm = TRUE)
overall_average_NoisyInformed2_pnl <- rowMeans(average_NoisyInformed2_pnl, na.rm = TRUE)
overall_average_Noisy1_pnl <- rowMeans(average_Noisy1_pnl, na.rm = TRUE)
overall_average_Noisy2_pnl <- rowMeans(average_Noisy2_pnl, na.rm = TRUE)
overall_average_StochNoisy_pnl <- rowMeans(average_StochNoisy_pnl, na.rm = TRUE)

# Plot the overall averages
plot(overall_average_MM_pnl, type = "l", pch = 16, col = "black", main = "Overall Average PNL (sigma = 0.75)", xlab = "Position in List", ylab = "Value", ylim = c(min(c(overall_average_MM_pnl, overall_average_Informed_pnl, overall_average_NoisyInformed1_pnl, overall_average_NoisyInformed2_pnl, overall_average_Noisy1_pnl, overall_average_Noisy2_pnl, overall_average_StochNoisy_pnl)), max(c(overall_average_MM_pnl, overall_average_Informed_pnl, overall_average_NoisyInformed1_pnl, overall_average_NoisyInformed2_pnl, overall_average_Noisy1_pnl, overall_average_Noisy2_pnl, overall_average_StochNoisy_pnl))))
lines(overall_average_Informed_pnl, type = "l", pch = 16, col = "red")
lines(overall_average_NoisyInformed1_pnl, type = "l", pch = 16, col = "green")
lines(overall_average_NoisyInformed2_pnl, type = "l", pch = 16, col = "yellow")
lines(overall_average_Noisy1_pnl, type = "l", pch = 16, col = "blue")
lines(overall_average_Noisy2_pnl, type = "l", pch = 16, col = "purple")
lines(overall_average_StochNoisy_pnl, type = "l", pch = 16, col = "orange")

# Add legend
legend("bottomleft", legend = c("Market Maker", "Informed", "Noisy Informed 1", "Noisy Informed 2", "Noisy 1", "Noisy 2", "Stochastic Noisy"), col = c("black", "red", "green", "yellow", "blue", "purple", "orange"), lty = 1, cex = 0.8)

set 4 with sigma = 1

# Initialize matrices to store averages for each position
average_MM_pnl <- matrix(NA, nrow = 100, ncol = 10)
average_Informed_pnl <- matrix(NA, nrow = 100, ncol = 10)
average_NoisyInformed1_pnl <- matrix(NA, nrow = 100, ncol = 10)
average_NoisyInformed2_pnl <- matrix(NA, nrow = 100, ncol = 10)
average_Noisy1_pnl <- matrix(NA, nrow = 100, ncol = 10)
average_Noisy2_pnl <- matrix(NA, nrow = 100, ncol = 10)
average_StochNoisy_pnl <- matrix(NA, nrow = 100, ncol = 10)

# Loop through each simulation (n)
for (n in 1:10) {

  MM_pnl_set4_1 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_4_1[n, 6])), ", ")

  Informed_pnl_set4_1 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_4_1[n, 8])), ", ")
  
  NoisyInformed1_pnl_set4_1 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_4_1[n, 10])), ", ")
  
  NoisyInformed2_pnl_set4_1 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_4_1[n, 12])), ", ")
  
  Noisy1_pnl_set4_1 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_4_1[n, 14])), ", ")
  
  Noisy2_pnl_set4_1 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_4_1[n, 16])), ", ")
  
  StochNoisy_pnl_set4_1 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_4_1[n, 18])), ", ")
  
  # Loop through each position (i)
  for (i in 1:100) {
    # Extract True and Expected values for the i-th position
    MM_pnl <- sapply(MM_pnl_set4_1, function(x) as.numeric(x[i]))
    Informed_pnl <- sapply(Informed_pnl_set4_1, function(x) as.numeric(x[i]))
    NoisyInformed1_pnl <- sapply(NoisyInformed1_pnl_set4_1, function(x) as.numeric(x[i]))
    NoisyInformed2_pnl <- sapply(NoisyInformed2_pnl_set4_1, function(x) as.numeric(x[i]))
    Noisy1_pnl <- sapply(Noisy1_pnl_set4_1, function(x) as.numeric(x[i]))
    Noisy2_pnl <- sapply(Noisy2_pnl_set4_1, function(x) as.numeric(x[i]))
    StochNoisy_pnl <- sapply(StochNoisy_pnl_set4_1, function(x) as.numeric(x[i]))
    
    # Calculate the average of True and Expected values for the i-th position
    average_MM_pnl[i, n] <- mean(MM_pnl, na.rm = TRUE)
    average_Informed_pnl[i, n] <- mean(Informed_pnl, na.rm = TRUE)
    average_NoisyInformed1_pnl[i, n] <- mean(NoisyInformed1_pnl, na.rm = TRUE)
    average_NoisyInformed2_pnl[i, n] <- mean(NoisyInformed2_pnl, na.rm = TRUE)
    average_Noisy1_pnl[i, n] <- mean(Noisy1_pnl, na.rm = TRUE)
    average_Noisy2_pnl[i, n] <- mean(Noisy2_pnl, na.rm = TRUE)
    average_StochNoisy_pnl[i, n] <- mean(StochNoisy_pnl, na.rm = TRUE)
  }
}

# Calculate the overall average for each position across all simulations
overall_average_MM_pnl <- rowMeans(average_MM_pnl, na.rm = TRUE)
overall_average_Informed_pnl <- rowMeans(average_Informed_pnl, na.rm = TRUE)
overall_average_NoisyInformed1_pnl <- rowMeans(average_NoisyInformed1_pnl, na.rm = TRUE)
overall_average_NoisyInformed2_pnl <- rowMeans(average_NoisyInformed2_pnl, na.rm = TRUE)
overall_average_Noisy1_pnl <- rowMeans(average_Noisy1_pnl, na.rm = TRUE)
overall_average_Noisy2_pnl <- rowMeans(average_Noisy2_pnl, na.rm = TRUE)
overall_average_StochNoisy_pnl <- rowMeans(average_StochNoisy_pnl, na.rm = TRUE)

# Plot the overall averages
plot(overall_average_MM_pnl, type = "l", pch = 16, col = "black", main = "Overall Average PNL (sigma = 1)", xlab = "Position in List", ylab = "Value", ylim = c(min(c(overall_average_MM_pnl, overall_average_Informed_pnl, overall_average_NoisyInformed1_pnl, overall_average_NoisyInformed2_pnl, overall_average_Noisy1_pnl, overall_average_Noisy2_pnl, overall_average_StochNoisy_pnl)), max(c(overall_average_MM_pnl, overall_average_Informed_pnl, overall_average_NoisyInformed1_pnl, overall_average_NoisyInformed2_pnl, overall_average_Noisy1_pnl, overall_average_Noisy2_pnl, overall_average_StochNoisy_pnl))))
lines(overall_average_Informed_pnl, type = "l", pch = 16, col = "red")
lines(overall_average_NoisyInformed1_pnl, type = "l", pch = 16, col = "green")
lines(overall_average_NoisyInformed2_pnl, type = "l", pch = 16, col = "yellow")
lines(overall_average_Noisy1_pnl, type = "l", pch = 16, col = "blue")
lines(overall_average_Noisy2_pnl, type = "l", pch = 16, col = "purple")
lines(overall_average_StochNoisy_pnl, type = "l", pch = 16, col = "orange")

# Add legend
legend("bottomleft", legend = c("Market Maker", "Informed", "Noisy Informed 1", "Noisy Informed 2", "Noisy 1", "Noisy 2", "Stochastic Noisy"), col = c("black", "red", "green", "yellow", "blue", "purple", "orange"), lty = 1, cex = 0.8)

set 4 with sigma = 2

# Initialize matrices to store averages for each position
average_MM_pnl <- matrix(NA, nrow = 100, ncol = 10)
average_Informed_pnl <- matrix(NA, nrow = 100, ncol = 10)
average_NoisyInformed1_pnl <- matrix(NA, nrow = 100, ncol = 10)
average_NoisyInformed2_pnl <- matrix(NA, nrow = 100, ncol = 10)
average_Noisy1_pnl <- matrix(NA, nrow = 100, ncol = 10)
average_Noisy2_pnl <- matrix(NA, nrow = 100, ncol = 10)
average_StochNoisy_pnl <- matrix(NA, nrow = 100, ncol = 10)

# Loop through each simulation (n)
for (n in 1:10) {

  MM_pnl_set4_2 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_4_2[n, 6])), ", ")

  Informed_pnl_set4_2 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_4_2[n, 8])), ", ")
  
  NoisyInformed1_pnl_set4_2 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_4_2[n, 10])), ", ")
  
  NoisyInformed2_pnl_set4_2 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_4_2[n, 12])), ", ")
  
  Noisy1_pnl_set4_2 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_4_2[n, 14])), ", ")
  
  Noisy2_pnl_set4_2 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_4_2[n, 16])), ", ")
  
  StochNoisy_pnl_set4_2 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_4_2[n, 18])), ", ")
  
  # Loop through each position (i)
  for (i in 1:100) {
    # Extract True and Expected values for the i-th position
    MM_pnl <- sapply(MM_pnl_set4_2, function(x) as.numeric(x[i]))
    Informed_pnl <- sapply(Informed_pnl_set4_2, function(x) as.numeric(x[i]))
    NoisyInformed1_pnl <- sapply(NoisyInformed1_pnl_set4_2, function(x) as.numeric(x[i]))
    NoisyInformed2_pnl <- sapply(NoisyInformed2_pnl_set4_2, function(x) as.numeric(x[i]))
    Noisy1_pnl <- sapply(Noisy1_pnl_set4_2, function(x) as.numeric(x[i]))
    Noisy2_pnl <- sapply(Noisy2_pnl_set4_2, function(x) as.numeric(x[i]))
    StochNoisy_pnl <- sapply(StochNoisy_pnl_set4_2, function(x) as.numeric(x[i]))
    
    # Calculate the average of True and Expected values for the i-th position
    average_MM_pnl[i, n] <- mean(MM_pnl, na.rm = TRUE)
    average_Informed_pnl[i, n] <- mean(Informed_pnl, na.rm = TRUE)
    average_NoisyInformed1_pnl[i, n] <- mean(NoisyInformed1_pnl, na.rm = TRUE)
    average_NoisyInformed2_pnl[i, n] <- mean(NoisyInformed2_pnl, na.rm = TRUE)
    average_Noisy1_pnl[i, n] <- mean(Noisy1_pnl, na.rm = TRUE)
    average_Noisy2_pnl[i, n] <- mean(Noisy2_pnl, na.rm = TRUE)
    average_StochNoisy_pnl[i, n] <- mean(StochNoisy_pnl, na.rm = TRUE)
  }
}

# Calculate the overall average for each position across all simulations
overall_average_MM_pnl <- rowMeans(average_MM_pnl, na.rm = TRUE)
overall_average_Informed_pnl <- rowMeans(average_Informed_pnl, na.rm = TRUE)
overall_average_NoisyInformed1_pnl <- rowMeans(average_NoisyInformed1_pnl, na.rm = TRUE)
overall_average_NoisyInformed2_pnl <- rowMeans(average_NoisyInformed2_pnl, na.rm = TRUE)
overall_average_Noisy1_pnl <- rowMeans(average_Noisy1_pnl, na.rm = TRUE)
overall_average_Noisy2_pnl <- rowMeans(average_Noisy2_pnl, na.rm = TRUE)
overall_average_StochNoisy_pnl <- rowMeans(average_StochNoisy_pnl, na.rm = TRUE)

# Plot the overall averages
plot(overall_average_MM_pnl, type = "l", pch = 16, col = "black", main = "Overall Average PNL (sigma = 2)", xlab = "Position in List", ylab = "Value", ylim = c(min(c(overall_average_MM_pnl, overall_average_Informed_pnl, overall_average_NoisyInformed1_pnl, overall_average_NoisyInformed2_pnl, overall_average_Noisy1_pnl, overall_average_Noisy2_pnl, overall_average_StochNoisy_pnl)), max(c(overall_average_MM_pnl, overall_average_Informed_pnl, overall_average_NoisyInformed1_pnl, overall_average_NoisyInformed2_pnl, overall_average_Noisy1_pnl, overall_average_Noisy2_pnl, overall_average_StochNoisy_pnl))))
lines(overall_average_Informed_pnl, type = "l", pch = 16, col = "red")
lines(overall_average_NoisyInformed1_pnl, type = "l", pch = 16, col = "green")
lines(overall_average_NoisyInformed2_pnl, type = "l", pch = 16, col = "yellow")
lines(overall_average_Noisy1_pnl, type = "l", pch = 16, col = "blue")
lines(overall_average_Noisy2_pnl, type = "l", pch = 16, col = "purple")
lines(overall_average_StochNoisy_pnl, type = "l", pch = 16, col = "orange")

# Add legend
legend("bottomleft", legend = c("Market Maker", "Informed", "Noisy Informed 1", "Noisy Informed 2", "Noisy 1", "Noisy 2", "Stochastic Noisy"), col = c("black", "red", "green", "yellow", "blue", "purple", "orange"), lty = 1, cex = 0.8)

set 4 with sigma = 5

# Initialize matrices to store averages for each position
average_MM_pnl <- matrix(NA, nrow = 100, ncol = 10)
average_Informed_pnl <- matrix(NA, nrow = 100, ncol = 10)
average_NoisyInformed1_pnl <- matrix(NA, nrow = 100, ncol = 10)
average_NoisyInformed2_pnl <- matrix(NA, nrow = 100, ncol = 10)
average_Noisy1_pnl <- matrix(NA, nrow = 100, ncol = 10)
average_Noisy2_pnl <- matrix(NA, nrow = 100, ncol = 10)
average_StochNoisy_pnl <- matrix(NA, nrow = 100, ncol = 10)

# Loop through each simulation (n)
for (n in 1:10) {

  MM_pnl_set4_5 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_4_5[n, 6])), ", ")

  Informed_pnl_set4_5 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_4_5[n, 8])), ", ")
  
  NoisyInformed1_pnl_set4_5 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_4_5[n, 10])), ", ")
  
  NoisyInformed2_pnl_set4_5 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_4_5[n, 12])), ", ")
  
  Noisy1_pnl_set4_5 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_4_5[n, 14])), ", ")
  
  Noisy2_pnl_set4_5 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_4_5[n, 16])), ", ")
  
  StochNoisy_pnl_set4_5 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_4_5[n, 18])), ", ")
  
  # Loop through each position (i)
  for (i in 1:100) {
    # Extract True and Expected values for the i-th position
    MM_pnl <- sapply(MM_pnl_set4_5, function(x) as.numeric(x[i]))
    Informed_pnl <- sapply(Informed_pnl_set4_5, function(x) as.numeric(x[i]))
    NoisyInformed1_pnl <- sapply(NoisyInformed1_pnl_set4_5, function(x) as.numeric(x[i]))
    NoisyInformed2_pnl <- sapply(NoisyInformed2_pnl_set4_5, function(x) as.numeric(x[i]))
    Noisy1_pnl <- sapply(Noisy1_pnl_set4_5, function(x) as.numeric(x[i]))
    Noisy2_pnl <- sapply(Noisy2_pnl_set4_5, function(x) as.numeric(x[i]))
    StochNoisy_pnl <- sapply(StochNoisy_pnl_set4_5, function(x) as.numeric(x[i]))
    
    # Calculate the average of True and Expected values for the i-th position
    average_MM_pnl[i, n] <- mean(MM_pnl, na.rm = TRUE)
    average_Informed_pnl[i, n] <- mean(Informed_pnl, na.rm = TRUE)
    average_NoisyInformed1_pnl[i, n] <- mean(NoisyInformed1_pnl, na.rm = TRUE)
    average_NoisyInformed2_pnl[i, n] <- mean(NoisyInformed2_pnl, na.rm = TRUE)
    average_Noisy1_pnl[i, n] <- mean(Noisy1_pnl, na.rm = TRUE)
    average_Noisy2_pnl[i, n] <- mean(Noisy2_pnl, na.rm = TRUE)
    average_StochNoisy_pnl[i, n] <- mean(StochNoisy_pnl, na.rm = TRUE)
  }
}

# Calculate the overall average for each position across all simulations
overall_average_MM_pnl <- rowMeans(average_MM_pnl, na.rm = TRUE)
overall_average_Informed_pnl <- rowMeans(average_Informed_pnl, na.rm = TRUE)
overall_average_NoisyInformed1_pnl <- rowMeans(average_NoisyInformed1_pnl, na.rm = TRUE)
overall_average_NoisyInformed2_pnl <- rowMeans(average_NoisyInformed2_pnl, na.rm = TRUE)
overall_average_Noisy1_pnl <- rowMeans(average_Noisy1_pnl, na.rm = TRUE)
overall_average_Noisy2_pnl <- rowMeans(average_Noisy2_pnl, na.rm = TRUE)
overall_average_StochNoisy_pnl <- rowMeans(average_StochNoisy_pnl, na.rm = TRUE)

# Plot the overall averages
plot(overall_average_MM_pnl, type = "l", pch = 16, col = "black", main = "Overall Average PNL (sigma = 5)", xlab = "Position in List", ylab = "Value", ylim = c(min(c(overall_average_MM_pnl, overall_average_Informed_pnl, overall_average_NoisyInformed1_pnl, overall_average_NoisyInformed2_pnl, overall_average_Noisy1_pnl, overall_average_Noisy2_pnl, overall_average_StochNoisy_pnl)), max(c(overall_average_MM_pnl, overall_average_Informed_pnl, overall_average_NoisyInformed1_pnl, overall_average_NoisyInformed2_pnl, overall_average_Noisy1_pnl, overall_average_Noisy2_pnl, overall_average_StochNoisy_pnl))))
lines(overall_average_Informed_pnl, type = "l", pch = 16, col = "red")
lines(overall_average_NoisyInformed1_pnl, type = "l", pch = 16, col = "green")
lines(overall_average_NoisyInformed2_pnl, type = "l", pch = 16, col = "yellow")
lines(overall_average_Noisy1_pnl, type = "l", pch = 16, col = "blue")
lines(overall_average_Noisy2_pnl, type = "l", pch = 16, col = "purple")
lines(overall_average_StochNoisy_pnl, type = "l", pch = 16, col = "orange")

# Add legend
legend("bottomleft", legend = c("Market Maker", "Informed", "Noisy Informed 1", "Noisy Informed 2", "Noisy 1", "Noisy 2", "Stochastic Noisy"), col = c("black", "red", "green", "yellow", "blue", "purple", "orange"), lty = 1, cex = 0.8)

MM_pnl_set4_5 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_4_5[4, 6])), ", ")[[1]]
Informed_pnl_set4_5 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_4_5[4, 8])), ", ")[[1]]
NoisyInformed1_pnl_set4_5 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_4_5[4, 10])), ", ")[[1]]
NoisyInformed2_pnl_set4_5 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_4_5[4, 12])), ", ")[[1]]
Noisy1_pnl_set4_5 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_4_5[4, 14])), ", ")[[1]]
Noisy2_pnl_set4_5 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_4_5[4, 16])), ", ")[[1]]
StochNoisy_pnl_set4_5 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_4_5[4, 18])), ", ")[[1]]

#Bids_set1 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_1[5, 4])), ", ")[[1]]
#Asks_set1 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_1[5, 5])), ", ")[[1]]

plot(MM_pnl_set4_5, 
     type = "l", 
     pch = 16, 
     col = "black", 
     main = "PNL Simulation 4", 
     xlab = "Position in List", 
     ylab = "Value",
     ylim = c(min(c(as.numeric(MM_pnl_set4_5), as.numeric(Informed_pnl_set4_5), as.numeric(NoisyInformed1_pnl_set4_5), as.numeric(NoisyInformed2_pnl_set4_5), as.numeric(Noisy1_pnl_set4_5), as.numeric(Noisy2_pnl_set4_5), as.numeric(StochNoisy_pnl_set4_5))), 
              max(c(as.numeric(MM_pnl_set4_5), as.numeric(Informed_pnl_set4_5), as.numeric(NoisyInformed1_pnl_set4_5), as.numeric(NoisyInformed2_pnl_set4_5), as.numeric(Noisy1_pnl_set4_5), as.numeric(Noisy2_pnl_set4_5), as.numeric(StochNoisy_pnl_set4_5)))))

lines(Informed_pnl_set4_5, type = "l", pch = 16, col = "red")
lines(NoisyInformed1_pnl_set4_5, type = "l", pch = 16, col = "green")
lines(NoisyInformed2_pnl_set4_5, type = "l", pch = 16, col = "yellow")
lines(Noisy1_pnl_set4_5, type = "l", pch = 16, col = "blue")
lines(Noisy2_pnl_set4_5, type = "l", pch = 16, col = "purple")
lines(StochNoisy_pnl_set4_5, type = "l", pch = 16, col = "orange")

# Add legend
legend("bottomleft", legend = c("Market Maker", "Informed", "Noisy Informed 1", "Noisy Informed 2", "Noisy 1", "Noisy 2", "Stochastic Noisy"), col = c("black", "red", "green", "yellow", "blue", "purple", "orange"), lty = 1, cex = 0.8)

set 5 (Noisy*6)

# Initialize matrices to store averages for each position
average_true <- matrix(NA, nrow = 100, ncol = 10)
average_expected <- matrix(NA, nrow = 100, ncol = 10)

# Loop through each simulation (n)
for (n in 1:10) {
  # Extract True values from the aggregated_results_4 dataframe
  TrueValues_set5 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_5[n, 2])), ", ")
  
  # Extract Expected values from the aggregated_results_4 dataframe
  ExpectedValues_set5 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_4[n, 3])), ", ")
  
  # Loop through each position (i)
  for (i in 1:100) {
    # Extract True and Expected values for the i-th position
    True_values <- sapply(TrueValues_set5, function(x) as.numeric(x[i]))
    Expected_values <- sapply(ExpectedValues_set5, function(x) as.numeric(x[i]))
    
    # Calculate the average of True and Expected values for the i-th position
    average_true[i, n] <- mean(True_values, na.rm = TRUE)
    average_expected[i, n] <- mean(Expected_values, na.rm = TRUE)
  }
}

# Calculate the overall average for each position across all simulations
overall_average_true <- rowMeans(average_true, na.rm = TRUE)
overall_average_expected <- rowMeans(average_expected, na.rm = TRUE)

# Plot the overall averages
plot(overall_average_true, type = "l", pch = 16, col = "blue", main = "Overall Average of True vs Expected Values", xlab = "Position in List", ylab = "Value", ylim = c(min(c(overall_average_true, overall_average_expected)), max(c(overall_average_true, overall_average_expected))))
lines(overall_average_expected, type = "l", pch = 16, col = "red")
legend("topright", legend = c("True Values", "Expected Values"), col = c("blue", "red"), lty = 1, cex = 0.8)

# Initialize matrices to store averages for each position
average_bid <- matrix(NA, nrow = 100, ncol = 10)
average_ask <- matrix(NA, nrow = 100, ncol = 10)

# Loop through each simulation (n)
for (n in 1:10) {
  # Extract True values from the aggregated_results_4 dataframe
  Bids_set5 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_5[n, 4])), ", ")
  
  # Extract Expected values from the aggregated_results_4 dataframe
  Asks_set5 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_5[n, 5])), ", ")
  
  # Loop through each position (i)
  for (i in 1:100) {
    # Extract True and Expected values for the i-th position
    Bids <- sapply(Bids_set5, function(x) as.numeric(x[i]))
    Asks <- sapply(Asks_set5, function(x) as.numeric(x[i]))
    
    # Calculate the average of True and Expected values for the i-th position
    average_bid[i, n] <- mean(Bids, na.rm = TRUE)
    average_ask[i, n] <- mean(Asks, na.rm = TRUE)
  }
}

# Calculate the overall average for each position across all simulations
overall_average_bid <- rowMeans(average_bid, na.rm = TRUE)
overall_average_ask <- rowMeans(average_ask, na.rm = TRUE)

# Plot the overall averages
plot(overall_average_bid, type = "l", pch = 16, col = "blue", main = "Overall Average of Bids vs Asks", xlab = "Position in List", ylab = "Value", ylim = c(min(c(overall_average_bid, overall_average_ask)), max(c(overall_average_bid, overall_average_ask))))
lines(overall_average_ask, type = "l", pch = 16, col = "red")
legend("topright", legend = c("Bids", "Asks"), col = c("blue", "red"), lty = 1, cex = 0.8)

# Initialize matrices to store averages for each position
average_bid <- matrix(NA, nrow = 100, ncol = 10)
average_ask <- matrix(NA, nrow = 100, ncol = 10)

# Loop through each simulation (n)
for (n in 1:10) {
  # Extract True values from the aggregated_results_4 dataframe
  Bids_set5 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_5[n, 4])), ", ")
  
  # Extract Expected values from the aggregated_results_4 dataframe
  Asks_set5 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_5[n, 5])), ", ")
  
  # Loop through each position (i)
  for (i in 1:100) {
    # Extract True and Expected values for the i-th position
    Bids <- sapply(Bids_set5, function(x) as.numeric(x[i]))
    Asks <- sapply(Asks_set5, function(x) as.numeric(x[i]))
    
    # Calculate the average of True and Expected values for the i-th position
    average_bid[i, n] <- mean(Bids, na.rm = TRUE)
    average_ask[i, n] <- mean(Asks, na.rm = TRUE)
  }
}

# Calculate the overall average for each position across all simulations
overall_average_bid <- rowMeans(average_bid, na.rm = TRUE)
overall_average_ask <- rowMeans(average_ask, na.rm = TRUE)

## True Value
# Initialize matrices to store averages for each position
average_true <- matrix(NA, nrow = 100, ncol = 10)
average_expected <- matrix(NA, nrow = 100, ncol = 10)

# Loop through each simulation (n)
for (n in 1:10) {
  # Extract True values from the aggregated_results_4 dataframe
  TrueValues_set5 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_5[n, 2])), ", ")

  # Extract Expected values from the aggregated_results_4 dataframe
  ExpectedValues_set5 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_5[n, 3])), ", ")
  
  # Loop through each position (i)
  for (i in 1:100) {
    # Extract True and Expected values for the i-th position
    True_values <- sapply(TrueValues_set5, function(x) as.numeric(x[i]))
    Expected_values <- sapply(ExpectedValues_set5, function(x) as.numeric(x[i]))
    
    # Calculate the average of True and Expected values for the i-th position
    average_true[i, n] <- mean(True_values, na.rm = TRUE)
    average_expected[i, n] <- mean(Expected_values, na.rm = TRUE)
  }
}

# Calculate the overall average for each position across all simulations
overall_average_true <- rowMeans(average_true, na.rm = TRUE)
overall_average_expected <- rowMeans(average_expected, na.rm = TRUE)

# Plot the overall averages
#plot(overall_average_true, type = "l", pch = 16, col = "blue", main = "Overall Average of True vs Expected Values", xlab = "Position in List", ylab = "Value", ylim = c(min(c(overall_average_true, overall_average_expected)), max(c(overall_average_true, overall_average_expected))))
#lines(overall_average_expected, type = "l", pch = 16, col = "red")
#legend("topright", legend = c("True Values", "Expected Values"), col = c("blue", "red"), lty = 1, cex = 0.8)

# Plot the overall averages
plot(overall_average_bid, type = "l", pch = 16, col = "blue", main = "Overall Average of Bids vs Asks & True vs Expected Values", xlab = "Position in List", ylab = "Value", ylim = c(min(c(overall_average_bid, overall_average_ask, overall_average_true, overall_average_expected)), max(c(overall_average_bid, overall_average_ask, overall_average_true, overall_average_expected))))
lines(overall_average_ask, type = "l", pch = 16, col = "red")
lines(overall_average_true, type = "l", pch = 16, col = "green")
lines(overall_average_expected, type = "l", pch = 16, col = "purple")
legend("bottomleft", legend = c("Bids", "Asks", "True Value", "Expected Value"), col = c("blue", "red", "green", "purple"), lty = 1, cex = 0.8)

# Initialize matrices to store averages for each position
average_MM_pnl <- matrix(NA, nrow = 100, ncol = 10)
average_Noisy1_pnl <- matrix(NA, nrow = 100, ncol = 10)
average_Noisy2_pnl <- matrix(NA, nrow = 100, ncol = 10)
average_Noisy3_pnl <- matrix(NA, nrow = 100, ncol = 10)
average_Noisy4_pnl <- matrix(NA, nrow = 100, ncol = 10)
average_Noisy5_pnl <- matrix(NA, nrow = 100, ncol = 10)
average_Noisy6_pnl <- matrix(NA, nrow = 100, ncol = 10)

# Loop through each simulation (n)
for (n in 1:10) {

  MM_pnl_set5 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_5[n, 6])), ", ")

  Noisy1_pnl_set5 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_5[n, 8])), ", ")
  
  Noisy2_pnl_set5 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_5[n, 10])), ", ")
  
  Noisy3_pnl_set5 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_5[n, 12])), ", ")
  
  Noisy4_pnl_set5 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_5[n, 14])), ", ")
  
  Noisy5_pnl_set5 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_5[n, 16])), ", ")
  
  Noisy6_pnl_set5 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_5[n, 18])), ", ")
  
  # Loop through each position (i)
  for (i in 1:100) {
    # Extract True and Expected values for the i-th position
    MM_pnl <- sapply(MM_pnl_set5, function(x) as.numeric(x[i]))
    Noisy1_pnl <- sapply(Noisy1_pnl_set5, function(x) as.numeric(x[i]))
    Noisy2_pnl <- sapply(Noisy2_pnl_set5, function(x) as.numeric(x[i]))
    Noisy3_pnl <- sapply(Noisy3_pnl_set5, function(x) as.numeric(x[i]))
    Noisy4_pnl <- sapply(Noisy4_pnl_set5, function(x) as.numeric(x[i]))
    Noisy5_pnl <- sapply(Noisy5_pnl_set5, function(x) as.numeric(x[i]))
    Noisy6_pnl <- sapply(Noisy6_pnl_set5, function(x) as.numeric(x[i]))
    
    # Calculate the average of True and Expected values for the i-th position
    average_MM_pnl[i, n] <- mean(MM_pnl, na.rm = TRUE)
    average_Noisy1_pnl[i, n] <- mean(Noisy1_pnl, na.rm = TRUE)
    average_Noisy2_pnl[i, n] <- mean(Noisy2_pnl, na.rm = TRUE)
    average_Noisy3_pnl[i, n] <- mean(Noisy3_pnl, na.rm = TRUE)
    average_Noisy4_pnl[i, n] <- mean(Noisy4_pnl, na.rm = TRUE)
    average_Noisy5_pnl[i, n] <- mean(Noisy5_pnl, na.rm = TRUE)
    average_Noisy6_pnl[i, n] <- mean(Noisy6_pnl, na.rm = TRUE)
  }
}

# Calculate the overall average for each position across all simulations
overall_average_MM_pnl <- rowMeans(average_MM_pnl, na.rm = TRUE)
overall_average_Noisy1_pnl <- rowMeans(average_Noisy1_pnl, na.rm = TRUE)
overall_average_Noisy2_pnl <- rowMeans(average_Noisy2_pnl, na.rm = TRUE)
overall_average_Noisy3_pnl <- rowMeans(average_Noisy3_pnl, na.rm = TRUE)
overall_average_Noisy4_pnl <- rowMeans(average_Noisy4_pnl, na.rm = TRUE)
overall_average_Noisy5_pnl <- rowMeans(average_Noisy5_pnl, na.rm = TRUE)
overall_average_Noisy6_pnl <- rowMeans(average_Noisy6_pnl, na.rm = TRUE)

# Plot the overall averages
plot(overall_average_MM_pnl, type = "l", pch = 16, col = "black", main = "Overall Average PNL", xlab = "Position in List", ylab = "Value", ylim = c(min(c(overall_average_MM_pnl, overall_average_Noisy1_pnl, overall_average_Noisy2_pnl, overall_average_Noisy3_pnl, overall_average_Noisy4_pnl, overall_average_Noisy5_pnl, overall_average_Noisy6_pnl)), max(c(overall_average_MM_pnl, overall_average_Noisy1_pnl, overall_average_Noisy2_pnl, overall_average_Noisy3_pnl, overall_average_Noisy4_pnl, overall_average_Noisy5_pnl, overall_average_Noisy6_pnl))))
lines(overall_average_Noisy1_pnl, type = "l", pch = 16, col = "red")
lines(overall_average_Noisy2_pnl, type = "l", pch = 16, col = "green")
lines(overall_average_Noisy3_pnl, type = "l", pch = 16, col = "yellow")
lines(overall_average_Noisy4_pnl, type = "l", pch = 16, col = "blue")
lines(overall_average_Noisy5_pnl, type = "l", pch = 16, col = "purple")
lines(overall_average_Noisy6_pnl, type = "l", pch = 16, col = "orange")

# Add legend
legend("topleft", legend = c("Market Maker", "Noisy 1", "Noisy 2", "Noisy 3", "Noisy 4", "Noisy 5", "Noisy 6"), col = c("black", "red", "green", "yellow", "blue", "purple", "orange"), lty = 1, cex = 0.8)

# Initialize matrices to store averages for each position
average_MM_pos <- matrix(NA, nrow = 100, ncol = 10)
average_Noisy1_pos <- matrix(NA, nrow = 100, ncol = 10)
average_Noisy2_pos <- matrix(NA, nrow = 100, ncol = 10)
average_Noisy3_pos <- matrix(NA, nrow = 100, ncol = 10)
average_Noisy4_pos <- matrix(NA, nrow = 100, ncol = 10)
average_Noisy5_pos <- matrix(NA, nrow = 100, ncol = 10)
average_Noisy6_pos <- matrix(NA, nrow = 100, ncol = 10)

# Loop through each simulation (n)
for (n in 1:10) {

  MM_pos_set5 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_5[n, 7])), ", ")

  Noisy1_pos_set5 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_5[n, 9])), ", ")
  
  Noisy2_pos_set5 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_5[n, 11])), ", ")
  
  Noisy3_pos_set5 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_5[n, 13])), ", ")
  
  Noisy4_pos_set5 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_5[n, 15])), ", ")
  
  Noisy5_pos_set5 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_5[n, 17])), ", ")
  
  Noisy6_pos_set5 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_5[n, 19])), ", ")
  
  # Loop through each position (i)
  for (i in 1:100) {
    # Extract True and Expected values for the i-th position
    MM_pos <- sapply(MM_pos_set5, function(x) as.numeric(x[i]))
    Noisy1_pos <- sapply(Noisy1_pos_set5, function(x) as.numeric(x[i]))
    Noisy2_pos <- sapply(Noisy2_pos_set5, function(x) as.numeric(x[i]))
    Noisy3_pos <- sapply(Noisy3_pos_set5, function(x) as.numeric(x[i]))
    Noisy4_pos <- sapply(Noisy4_pos_set5, function(x) as.numeric(x[i]))
    Noisy5_pos <- sapply(Noisy5_pos_set5, function(x) as.numeric(x[i]))
    Noisy6_pos <- sapply(Noisy6_pos_set5, function(x) as.numeric(x[i]))
    
    # Calculate the average of True and Expected values for the i-th position
    average_MM_pos[i, n] <- mean(MM_pos, na.rm = TRUE)
    average_Noisy1_pos[i, n] <- mean(Noisy1_pos, na.rm = TRUE)
    average_Noisy2_pos[i, n] <- mean(Noisy2_pos, na.rm = TRUE)
    average_Noisy3_pos[i, n] <- mean(Noisy3_pos, na.rm = TRUE)
    average_Noisy4_pos[i, n] <- mean(Noisy4_pos, na.rm = TRUE)
    average_Noisy5_pos[i, n] <- mean(Noisy5_pos, na.rm = TRUE)
    average_Noisy6_pos[i, n] <- mean(Noisy6_pos, na.rm = TRUE)
  }
}

# Calculate the overall average for each position across all simulations
overall_average_MM_pos <- rowMeans(average_MM_pos, na.rm = TRUE)
overall_average_Noisy1_pos <- rowMeans(average_Noisy1_pos, na.rm = TRUE)
overall_average_Noisy2_pos <- rowMeans(average_Noisy2_pos, na.rm = TRUE)
overall_average_Noisy3_pos <- rowMeans(average_Noisy3_pos, na.rm = TRUE)
overall_average_Noisy4_pos <- rowMeans(average_Noisy4_pos, na.rm = TRUE)
overall_average_Noisy5_pos <- rowMeans(average_Noisy5_pos, na.rm = TRUE)
overall_average_Noisy6_pos <- rowMeans(average_Noisy6_pos, na.rm = TRUE)

# Plot the overall averages
plot(overall_average_MM_pos, type = "l", pch = 16, col = "black", main = "Overall Average Position", xlab = "Position in List", ylab = "Value", ylim = c(min(c(overall_average_MM_pos, overall_average_Noisy1_pos, overall_average_Noisy2_pos, overall_average_Noisy3_pos, overall_average_Noisy4_pos, overall_average_Noisy5_pos, overall_average_Noisy6_pos)), max(c(overall_average_MM_pos, overall_average_Noisy1_pos, overall_average_Noisy2_pos, overall_average_Noisy3_pos, overall_average_Noisy4_pos, overall_average_Noisy5_pos, overall_average_Noisy6_pos))))
lines(overall_average_Noisy1_pos, type = "l", pch = 16, col = "red")
lines(overall_average_Noisy2_pos, type = "l", pch = 16, col = "green")
lines(overall_average_Noisy3_pos, type = "l", pch = 16, col = "yellow")
lines(overall_average_Noisy4_pos, type = "l", pch = 16, col = "blue")
lines(overall_average_Noisy5_pos, type = "l", pch = 16, col = "purple")
lines(overall_average_Noisy6_pos, type = "l", pch = 16, col = "orange")

# Add legend
legend("topleft", legend = c("Market Maker", "Noisy 1", "Noisy 2", "Noisy 3", "Noisy 4", "Noisy 5", "Noisy 6"), col = c("black", "red", "green", "yellow", "blue", "purple", "orange"), lty = 1, cex = 0.8)

set6 (1 informed + 5 noisy)

# Initialize matrices to store averages for each position
average_true <- matrix(NA, nrow = 100, ncol = 10)
average_expected <- matrix(NA, nrow = 100, ncol = 10)

# Loop through each simulation (n)
for (n in 1:10) {
  # Extract True values from the aggregated_results_4 dataframe
  TrueValues_set6 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_6[n, 2])), ", ")
  
  # Extract Expected values from the aggregated_results_4 dataframe
  ExpectedValues_set6 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_6[n, 3])), ", ")
  
  # Loop through each position (i)
  for (i in 1:100) {
    # Extract True and Expected values for the i-th position
    True_values <- sapply(TrueValues_set6, function(x) as.numeric(x[i]))
    Expected_values <- sapply(ExpectedValues_set6, function(x) as.numeric(x[i]))
    
    # Calculate the average of True and Expected values for the i-th position
    average_true[i, n] <- mean(True_values, na.rm = TRUE)
    average_expected[i, n] <- mean(Expected_values, na.rm = TRUE)
  }
}

# Calculate the overall average for each position across all simulations
overall_average_true <- rowMeans(average_true, na.rm = TRUE)
overall_average_expected <- rowMeans(average_expected, na.rm = TRUE)

# Plot the overall averages
plot(overall_average_true, type = "l", pch = 16, col = "blue", main = "Overall Average of True vs Expected Values", xlab = "Position in List", ylab = "Value", ylim = c(min(c(overall_average_true, overall_average_expected)), max(c(overall_average_true, overall_average_expected))))
lines(overall_average_expected, type = "l", pch = 16, col = "red")
legend("topright", legend = c("True Values", "Expected Values"), col = c("blue", "red"), lty = 1, cex = 0.8)

# Initialize matrices to store averages for each position
average_bid <- matrix(NA, nrow = 100, ncol = 10)
average_ask <- matrix(NA, nrow = 100, ncol = 10)

# Loop through each simulation (n)
for (n in 1:10) {
  # Extract True values from the aggregated_results_4 dataframe
  Bids_set6 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_6[n, 4])), ", ")
  
  # Extract Expected values from the aggregated_results_4 dataframe
  Asks_set6 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_6[n, 5])), ", ")
  
  # Loop through each position (i)
  for (i in 1:100) {
    # Extract True and Expected values for the i-th position
    Bids <- sapply(Bids_set6, function(x) as.numeric(x[i]))
    Asks <- sapply(Asks_set6, function(x) as.numeric(x[i]))
    
    # Calculate the average of True and Expected values for the i-th position
    average_bid[i, n] <- mean(Bids, na.rm = TRUE)
    average_ask[i, n] <- mean(Asks, na.rm = TRUE)
  }
}

# Calculate the overall average for each position across all simulations
overall_average_bid <- rowMeans(average_bid, na.rm = TRUE)
overall_average_ask <- rowMeans(average_ask, na.rm = TRUE)

# Plot the overall averages
plot(overall_average_bid, type = "l", pch = 16, col = "blue", main = "Overall Average of Bids vs Asks", xlab = "Position in List", ylab = "Value", ylim = c(min(c(overall_average_bid, overall_average_ask)), max(c(overall_average_bid, overall_average_ask))))
lines(overall_average_ask, type = "l", pch = 16, col = "red")
legend("topright", legend = c("Bids", "Asks"), col = c("blue", "red"), lty = 1, cex = 0.8)

# Initialize matrices to store averages for each position
average_bid <- matrix(NA, nrow = 100, ncol = 10)
average_ask <- matrix(NA, nrow = 100, ncol = 10)

# Loop through each simulation (n)
for (n in 1:10) {
  # Extract True values from the aggregated_results_4 dataframe
  Bids_set6 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_6[n, 4])), ", ")
  
  # Extract Expected values from the aggregated_results_4 dataframe
  Asks_set6 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_6[n, 5])), ", ")
  
  # Loop through each position (i)
  for (i in 1:100) {
    # Extract True and Expected values for the i-th position
    Bids <- sapply(Bids_set6, function(x) as.numeric(x[i]))
    Asks <- sapply(Asks_set6, function(x) as.numeric(x[i]))
    
    # Calculate the average of True and Expected values for the i-th position
    average_bid[i, n] <- mean(Bids, na.rm = TRUE)
    average_ask[i, n] <- mean(Asks, na.rm = TRUE)
  }
}

# Calculate the overall average for each position across all simulations
overall_average_bid <- rowMeans(average_bid, na.rm = TRUE)
overall_average_ask <- rowMeans(average_ask, na.rm = TRUE)

## True Value
# Initialize matrices to store averages for each position
average_true <- matrix(NA, nrow = 100, ncol = 10)
average_expected <- matrix(NA, nrow = 100, ncol = 10)

# Loop through each simulation (n)
for (n in 1:10) {
  # Extract True values from the aggregated_results_4 dataframe
  TrueValues_set6 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_6[n, 2])), ", ")
  
  # Extract Expected values from the aggregated_results_4 dataframe
  ExpectedValues_set6 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_6[n, 3])), ", ")
  
  # Loop through each position (i)
  for (i in 1:100) {
    # Extract True and Expected values for the i-th position
    True_values <- sapply(TrueValues_set6, function(x) as.numeric(x[i]))
    Expected_values <- sapply(ExpectedValues_set6, function(x) as.numeric(x[i]))
    
    # Calculate the average of True and Expected values for the i-th position
    average_true[i, n] <- mean(True_values, na.rm = TRUE)
    average_expected[i, n] <- mean(Expected_values, na.rm = TRUE)
  }
}

# Calculate the overall average for each position across all simulations
overall_average_true <- rowMeans(average_true, na.rm = TRUE)
overall_average_expected <- rowMeans(average_expected, na.rm = TRUE)

# Plot the overall averages
#plot(overall_average_true, type = "l", pch = 16, col = "blue", main = "Overall Average of True vs Expected Values", xlab = "Position in List", ylab = "Value", ylim = c(min(c(overall_average_true, overall_average_expected)), max(c(overall_average_true, overall_average_expected))))
#lines(overall_average_expected, type = "l", pch = 16, col = "red")
#legend("topright", legend = c("True Values", "Expected Values"), col = c("blue", "red"), lty = 1, cex = 0.8)

# Plot the overall averages
plot(overall_average_bid, type = "l", pch = 16, col = "blue", main = "Overall Average of Bids vs Asks & True vs Expected Values", xlab = "Position in List", ylab = "Value", ylim = c(min(c(overall_average_bid, overall_average_ask, overall_average_true, overall_average_expected)), max(c(overall_average_bid, overall_average_ask, overall_average_true, overall_average_expected))))
lines(overall_average_ask, type = "l", pch = 16, col = "red")
lines(overall_average_true, type = "l", pch = 16, col = "green")
lines(overall_average_expected, type = "l", pch = 16, col = "purple")
legend("bottomleft", legend = c("Bids", "Asks", "True Value", "Expected Value"), col = c("blue", "red", "green", "purple"), lty = 1, cex = 0.8)

# Initialize matrices to store averages for each position
average_MM_pnl <- matrix(NA, nrow = 100, ncol = 10)
average_Informed_pnl <- matrix(NA, nrow = 100, ncol = 10)
average_Noisy1_pnl <- matrix(NA, nrow = 100, ncol = 10)
average_Noisy2_pnl <- matrix(NA, nrow = 100, ncol = 10)
average_Noisy3_pnl <- matrix(NA, nrow = 100, ncol = 10)
average_Noisy4_pnl <- matrix(NA, nrow = 100, ncol = 10)
average_Noisy5_pnl <- matrix(NA, nrow = 100, ncol = 10)

# Loop through each simulation (n)
for (n in 1:10) {

  MM_pnl_set6 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_6[n, 6])), ", ")

  Informed_pnl_set6 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_6[n, 8])), ", ")
  
  Noisy1_pnl_set6 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_6[n, 10])), ", ")
  
  Noisy2_pnl_set6 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_6[n, 12])), ", ")
  
  Noisy3_pnl_set6 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_6[n, 14])), ", ")
  
  Noisy4_pnl_set6 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_6[n, 16])), ", ")
  
  Noisy5_pnl_set6 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_6[n, 18])), ", ")
  
  # Loop through each position (i)
  for (i in 1:100) {
    # Extract True and Expected values for the i-th position
    MM_pnl <- sapply(MM_pnl_set6, function(x) as.numeric(x[i]))
    Informed_pnl <- sapply(Informed_pnl_set6, function(x) as.numeric(x[i]))
    Noisy1_pnl <- sapply(Noisy1_pnl_set6, function(x) as.numeric(x[i]))
    Noisy2_pnl <- sapply(Noisy2_pnl_set6, function(x) as.numeric(x[i]))
    Noisy3_pnl <- sapply(Noisy3_pnl_set6, function(x) as.numeric(x[i]))
    Noisy4_pnl <- sapply(Noisy4_pnl_set6, function(x) as.numeric(x[i]))
    Noisy5_pnl <- sapply(Noisy5_pnl_set6, function(x) as.numeric(x[i]))
    
    # Calculate the average of True and Expected values for the i-th position
    average_MM_pnl[i, n] <- mean(MM_pnl, na.rm = TRUE)
    average_Informed_pnl[i, n] <- mean(Informed_pnl, na.rm = TRUE)
    average_Noisy1_pnl[i, n] <- mean(Noisy1_pnl, na.rm = TRUE)
    average_Noisy2_pnl[i, n] <- mean(Noisy2_pnl, na.rm = TRUE)
    average_Noisy3_pnl[i, n] <- mean(Noisy3_pnl, na.rm = TRUE)
    average_Noisy4_pnl[i, n] <- mean(Noisy4_pnl, na.rm = TRUE)
    average_Noisy5_pnl[i, n] <- mean(Noisy5_pnl, na.rm = TRUE)
  }
}

# Calculate the overall average for each position across all simulations
overall_average_MM_pnl <- rowMeans(average_MM_pnl, na.rm = TRUE)
overall_average_Informed_pnl <- rowMeans(average_Informed_pnl, na.rm = TRUE)
overall_average_Noisy1_pnl <- rowMeans(average_Noisy1_pnl, na.rm = TRUE)
overall_average_Noisy2_pnl <- rowMeans(average_Noisy2_pnl, na.rm = TRUE)
overall_average_Noisy3_pnl <- rowMeans(average_Noisy3_pnl, na.rm = TRUE)
overall_average_Noisy4_pnl <- rowMeans(average_Noisy4_pnl, na.rm = TRUE)
overall_average_Noisy5_pnl <- rowMeans(average_Noisy5_pnl, na.rm = TRUE)

# Plot the overall averages
plot(overall_average_MM_pnl, type = "l", pch = 16, col = "black", main = "Overall Average PNL", xlab = "Position in List", ylab = "Value", ylim = c(min(c(overall_average_MM_pnl, overall_average_Informed_pnl, overall_average_Noisy1_pnl, overall_average_Noisy2_pnl, overall_average_Noisy3_pnl, overall_average_Noisy4_pnl, overall_average_Noisy5_pnl)), max(c(overall_average_MM_pnl, overall_average_Informed_pnl, overall_average_Noisy1_pnl, overall_average_Noisy2_pnl, overall_average_Noisy3_pnl, overall_average_Noisy4_pnl, overall_average_Noisy5_pnl))))
lines(overall_average_Informed_pnl, type = "l", pch = 16, col = "red")
lines(overall_average_Noisy1_pnl, type = "l", pch = 16, col = "green")
lines(overall_average_Noisy2_pnl, type = "l", pch = 16, col = "yellow")
lines(overall_average_Noisy3_pnl, type = "l", pch = 16, col = "blue")
lines(overall_average_Noisy4_pnl, type = "l", pch = 16, col = "purple")
lines(overall_average_Noisy5_pnl, type = "l", pch = 16, col = "orange")

# Add legend
legend("bottomleft", legend = c("Market Maker", "Informed", "Noisy 1", "Noisy 2", "Noisy 3", "Noisy 4", "Noisy 5"), col = c("black", "red", "green", "yellow", "blue", "purple", "orange"), lty = 1, cex = 0.8)

# Initialize matrices to store averages for each position
average_MM_pos <- matrix(NA, nrow = 100, ncol = 10)
average_Informed_pos <- matrix(NA, nrow = 100, ncol = 10)
average_Noisy1_pos <- matrix(NA, nrow = 100, ncol = 10)
average_Noisy2_pos <- matrix(NA, nrow = 100, ncol = 10)
average_Noisy3_pos <- matrix(NA, nrow = 100, ncol = 10)
average_Noisy4_pos <- matrix(NA, nrow = 100, ncol = 10)
average_Noisy5_pos <- matrix(NA, nrow = 100, ncol = 10)

# Loop through each simulation (n)
for (n in 1:10) {

  MM_pos_set6 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_6[n, 7])), ", ")

  Informed_pos_set6 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_6[n, 9])), ", ")
  
  Noisy1_pos_set6 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_6[n, 11])), ", ")
  
  Noisy2_pos_set6 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_6[n, 13])), ", ")
  
  Noisy3_pos_set6 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_6[n, 15])), ", ")
  
  Noisy4_pos_set6 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_6[n, 17])), ", ")
  
  Noisy5_pos_set6 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_6[n, 19])), ", ")
  
  # Loop through each position (i)
  for (i in 1:100) {
    # Extract True and Expected values for the i-th position
    MM_pos <- sapply(MM_pos_set6, function(x) as.numeric(x[i]))
    Informed_pos <- sapply(Informed_pnl_set6, function(x) as.numeric(x[i]))
    Noisy1_pos <- sapply(Noisy1_pos_set6, function(x) as.numeric(x[i]))
    Noisy2_pos <- sapply(Noisy2_pos_set6, function(x) as.numeric(x[i]))
    Noisy3_pos <- sapply(Noisy3_pos_set6, function(x) as.numeric(x[i]))
    Noisy4_pos <- sapply(Noisy4_pos_set6, function(x) as.numeric(x[i]))
    Noisy5_pos <- sapply(Noisy5_pos_set6, function(x) as.numeric(x[i]))
    
    # Calculate the average of True and Expected values for the i-th position
    average_MM_pos[i, n] <- mean(MM_pos, na.rm = TRUE)
    average_Informed_pos[i, n] <- mean(Informed_pos, na.rm = TRUE)
    average_Noisy1_pos[i, n] <- mean(Noisy1_pos, na.rm = TRUE)
    average_Noisy2_pos[i, n] <- mean(Noisy2_pos, na.rm = TRUE)
    average_Noisy3_pos[i, n] <- mean(Noisy3_pos, na.rm = TRUE)
    average_Noisy4_pos[i, n] <- mean(Noisy4_pos, na.rm = TRUE)
    average_Noisy5_pos[i, n] <- mean(Noisy5_pos, na.rm = TRUE)
  }
}

# Calculate the overall average for each position across all simulations
overall_average_MM_pos <- rowMeans(average_MM_pos, na.rm = TRUE)
overall_average_Informed_pos <- rowMeans(average_Informed_pos, na.rm = TRUE)
overall_average_Noisy1_pos <- rowMeans(average_Noisy1_pos, na.rm = TRUE)
overall_average_Noisy2_pos <- rowMeans(average_Noisy2_pos, na.rm = TRUE)
overall_average_Noisy3_pos <- rowMeans(average_Noisy3_pos, na.rm = TRUE)
overall_average_Noisy4_pos <- rowMeans(average_Noisy4_pos, na.rm = TRUE)
overall_average_Noisy5_pos <- rowMeans(average_Noisy5_pos, na.rm = TRUE)

# Plot the overall averages
plot(overall_average_MM_pos, type = "l", pch = 16, col = "black", main = "Overall Average Position", xlab = "Position in List", ylab = "Value", ylim = c(min(c(overall_average_MM_pos, overall_average_Informed_pos, overall_average_Noisy1_pos, overall_average_Noisy2_pos, overall_average_Noisy3_pos, overall_average_Noisy4_pos, overall_average_Noisy5_pos)), max(c(overall_average_MM_pos, overall_average_Informed_pos, overall_average_Noisy1_pos, overall_average_Noisy2_pos, overall_average_Noisy3_pos, overall_average_Noisy4_pos, overall_average_Noisy5_pos))))
lines(overall_average_Informed_pos, type = "l", pch = 16, col = "red")
lines(overall_average_Noisy1_pos, type = "l", pch = 16, col = "green")
lines(overall_average_Noisy2_pos, type = "l", pch = 16, col = "yellow")
lines(overall_average_Noisy3_pos, type = "l", pch = 16, col = "blue")
lines(overall_average_Noisy4_pos, type = "l", pch = 16, col = "purple")
lines(overall_average_Noisy5_pos, type = "l", pch = 16, col = "orange")

# Add legend
legend("topleft", legend = c("Market Maker", "Informed", "Noisy 1", "Noisy 2", "Noisy 3", "Noisy 4", "Noisy 5"), col = c("black", "red", "green", "yellow", "blue", "purple", "orange"), lty = 1, cex = 0.8)

set7 (1 informed + 5 noisy informed)

# Initialize matrices to store averages for each position
average_true <- matrix(NA, nrow = 100, ncol = 10)
average_expected <- matrix(NA, nrow = 100, ncol = 10)

# Loop through each simulation (n)
for (n in 1:10) {
  # Extract True values from the aggregated_results_4 dataframe
  TrueValues_set7 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_7[n, 2])), ", ")
  
  # Extract Expected values from the aggregated_results_4 dataframe
  ExpectedValues_set7 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_7[n, 3])), ", ")
  
  # Loop through each position (i)
  for (i in 1:100) {
    # Extract True and Expected values for the i-th position
    True_values <- sapply(TrueValues_set7, function(x) as.numeric(x[i]))
    Expected_values <- sapply(ExpectedValues_set7, function(x) as.numeric(x[i]))
    
    # Calculate the average of True and Expected values for the i-th position
    average_true[i, n] <- mean(True_values, na.rm = TRUE)
    average_expected[i, n] <- mean(Expected_values, na.rm = TRUE)
  }
}

# Calculate the overall average for each position across all simulations
overall_average_true <- rowMeans(average_true, na.rm = TRUE)
overall_average_expected <- rowMeans(average_expected, na.rm = TRUE)

# Plot the overall averages
plot(overall_average_true, type = "l", pch = 16, col = "blue", main = "Overall Average of True vs Expected Values", xlab = "Position in List", ylab = "Value", ylim = c(min(c(overall_average_true, overall_average_expected)), max(c(overall_average_true, overall_average_expected))))
lines(overall_average_expected, type = "l", pch = 16, col = "red")
legend("topright", legend = c("True Values", "Expected Values"), col = c("blue", "red"), lty = 1, cex = 0.8)

# Initialize matrices to store averages for each position
average_bid <- matrix(NA, nrow = 100, ncol = 10)
average_ask <- matrix(NA, nrow = 100, ncol = 10)

# Loop through each simulation (n)
for (n in 1:10) {
  # Extract True values from the aggregated_results_4 dataframe
  Bids_set7 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_7[n, 4])), ", ")
  
  # Extract Expected values from the aggregated_results_4 dataframe
  Asks_set7 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_7[n, 5])), ", ")
  
  # Loop through each position (i)
  for (i in 1:100) {
    # Extract True and Expected values for the i-th position
    Bids <- sapply(Bids_set7, function(x) as.numeric(x[i]))
    Asks <- sapply(Asks_set7, function(x) as.numeric(x[i]))
    
    # Calculate the average of True and Expected values for the i-th position
    average_bid[i, n] <- mean(Bids, na.rm = TRUE)
    average_ask[i, n] <- mean(Asks, na.rm = TRUE)
  }
}

# Calculate the overall average for each position across all simulations
overall_average_bid <- rowMeans(average_bid, na.rm = TRUE)
overall_average_ask <- rowMeans(average_ask, na.rm = TRUE)

# Plot the overall averages
plot(overall_average_bid, type = "l", pch = 16, col = "blue", main = "Overall Average of Bids vs Asks", xlab = "Position in List", ylab = "Value", ylim = c(min(c(overall_average_bid, overall_average_ask)), max(c(overall_average_bid, overall_average_ask))))
lines(overall_average_ask, type = "l", pch = 16, col = "red")
legend("topright", legend = c("Bids", "Asks"), col = c("blue", "red"), lty = 1, cex = 0.8)

# Initialize matrices to store averages for each position
average_bid <- matrix(NA, nrow = 100, ncol = 10)
average_ask <- matrix(NA, nrow = 100, ncol = 10)

# Loop through each simulation (n)
for (n in 1:10) {
  # Extract True values from the aggregated_results_4 dataframe
  Bids_set7 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_7[n, 4])), ", ")
  
  # Extract Expected values from the aggregated_results_4 dataframe
  Asks_set7 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_7[n, 5])), ", ")
  
  # Loop through each position (i)
  for (i in 1:100) {
    # Extract True and Expected values for the i-th position
    Bids <- sapply(Bids_set7, function(x) as.numeric(x[i]))
    Asks <- sapply(Asks_set7, function(x) as.numeric(x[i]))
    
    # Calculate the average of True and Expected values for the i-th position
    average_bid[i, n] <- mean(Bids, na.rm = TRUE)
    average_ask[i, n] <- mean(Asks, na.rm = TRUE)
  }
}

# Calculate the overall average for each position across all simulations
overall_average_bid <- rowMeans(average_bid, na.rm = TRUE)
overall_average_ask <- rowMeans(average_ask, na.rm = TRUE)

## True Value
# Initialize matrices to store averages for each position
average_true <- matrix(NA, nrow = 100, ncol = 10)
average_expected <- matrix(NA, nrow = 100, ncol = 10)

# Loop through each simulation (n)
for (n in 1:10) {
  # Extract True values from the aggregated_results_4 dataframe
  TrueValues_set7 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_7[n, 2])), ", ")
  
  # Extract Expected values from the aggregated_results_4 dataframe
  ExpectedValues_set7 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_7[n, 3])), ", ")
  
  # Loop through each position (i)
  for (i in 1:100) {
    # Extract True and Expected values for the i-th position
    True_values <- sapply(TrueValues_set7, function(x) as.numeric(x[i]))
    Expected_values <- sapply(ExpectedValues_set7, function(x) as.numeric(x[i]))
    
    # Calculate the average of True and Expected values for the i-th position
    average_true[i, n] <- mean(True_values, na.rm = TRUE)
    average_expected[i, n] <- mean(Expected_values, na.rm = TRUE)
  }
}

# Calculate the overall average for each position across all simulations
overall_average_true <- rowMeans(average_true, na.rm = TRUE)
overall_average_expected <- rowMeans(average_expected, na.rm = TRUE)

# Plot the overall averages
#plot(overall_average_true, type = "l", pch = 16, col = "blue", main = "Overall Average of True vs Expected Values", xlab = "Position in List", ylab = "Value", ylim = c(min(c(overall_average_true, overall_average_expected)), max(c(overall_average_true, overall_average_expected))))
#lines(overall_average_expected, type = "l", pch = 16, col = "red")
#legend("topright", legend = c("True Values", "Expected Values"), col = c("blue", "red"), lty = 1, cex = 0.8)

# Plot the overall averages
plot(overall_average_bid, type = "l", pch = 16, col = "blue", main = "Overall Average of Bids vs Asks & True vs Expected Values", xlab = "Position in List", ylab = "Value", ylim = c(min(c(overall_average_bid, overall_average_ask, overall_average_true, overall_average_expected)), max(c(overall_average_bid, overall_average_ask, overall_average_true, overall_average_expected))))
lines(overall_average_ask, type = "l", pch = 16, col = "red")
lines(overall_average_true, type = "l", pch = 16, col = "green")
lines(overall_average_expected, type = "l", pch = 16, col = "purple")
legend("bottomleft", legend = c("Bids", "Asks", "True Value", "Expected Value"), col = c("blue", "red", "green", "purple"), lty = 1, cex = 0.8)

# Initialize matrices to store averages for each position
average_MM_pnl <- matrix(NA, nrow = 100, ncol = 10)
average_Informed_pnl <- matrix(NA, nrow = 100, ncol = 10)
average_NoisyInformed1_pnl <- matrix(NA, nrow = 100, ncol = 10)
average_NoisyInformed2_pnl <- matrix(NA, nrow = 100, ncol = 10)
average_NoisyInformed3_pnl <- matrix(NA, nrow = 100, ncol = 10)
average_NoisyInformed4_pnl <- matrix(NA, nrow = 100, ncol = 10)
average_NoisyInformed5_pnl <- matrix(NA, nrow = 100, ncol = 10)

# Loop through each simulation (n)
for (n in 1:10) {

  MM_pnl_set7 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_7[n, 6])), ", ")

  Informed_pnl_set7 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_7[n, 8])), ", ")
  
  NoisyInformed1_pnl_set7 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_7[n, 10])), ", ")
  
  NoisyInformed2_pnl_set7 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_7[n, 12])), ", ")
  
  NoisyInformed3_pnl_set7 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_7[n, 14])), ", ")
  
  NoisyInformed4_pnl_set7 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_7[n, 16])), ", ")
  
  NoisyInformed5_pnl_set7 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_7[n, 18])), ", ")
  
  # Loop through each position (i)
  for (i in 1:100) {
    # Extract True and Expected values for the i-th position
    MM_pnl <- sapply(MM_pnl_set7, function(x) as.numeric(x[i]))
    Informed_pnl <- sapply(Informed_pnl_set7, function(x) as.numeric(x[i]))
    NoisyInformed1_pnl <- sapply(NoisyInformed1_pnl_set7, function(x) as.numeric(x[i]))
    NoisyInformed2_pnl <- sapply(NoisyInformed2_pnl_set7, function(x) as.numeric(x[i]))
    NoisyInformed3_pnl <- sapply(NoisyInformed3_pnl_set7, function(x) as.numeric(x[i]))
    NoisyInformed4_pnl <- sapply(NoisyInformed4_pnl_set7, function(x) as.numeric(x[i]))
    NoisyInformed5_pnl <- sapply(NoisyInformed5_pnl_set7, function(x) as.numeric(x[i]))
    
    # Calculate the average of True and Expected values for the i-th position
    average_MM_pnl[i, n] <- mean(MM_pnl, na.rm = TRUE)
    average_Informed_pnl[i, n] <- mean(Informed_pnl, na.rm = TRUE)
    average_NoisyInformed1_pnl[i, n] <- mean(NoisyInformed1_pnl, na.rm = TRUE)
    average_NoisyInformed2_pnl[i, n] <- mean(NoisyInformed2_pnl, na.rm = TRUE)
    average_NoisyInformed3_pnl[i, n] <- mean(NoisyInformed3_pnl, na.rm = TRUE)
    average_NoisyInformed4_pnl[i, n] <- mean(NoisyInformed4_pnl, na.rm = TRUE)
    average_NoisyInformed5_pnl[i, n] <- mean(NoisyInformed5_pnl, na.rm = TRUE)
  }
}

# Calculate the overall average for each position across all simulations
overall_average_MM_pnl <- rowMeans(average_MM_pnl, na.rm = TRUE)
overall_average_Informed_pnl <- rowMeans(average_Informed_pnl, na.rm = TRUE)
overall_average_NoisyInformed1_pnl <- rowMeans(average_NoisyInformed1_pnl, na.rm = TRUE)
overall_average_NoisyInformed2_pnl <- rowMeans(average_NoisyInformed2_pnl, na.rm = TRUE)
overall_average_NoisyInformed3_pnl <- rowMeans(average_NoisyInformed3_pnl, na.rm = TRUE)
overall_average_NoisyInformed4_pnl <- rowMeans(average_NoisyInformed4_pnl, na.rm = TRUE)
overall_average_NoisyInformed5_pnl <- rowMeans(average_NoisyInformed5_pnl, na.rm = TRUE)

# Plot the overall averages
plot(overall_average_MM_pnl, type = "l", pch = 16, col = "black", main = "Overall Average PNL", xlab = "Position in List", ylab = "Value", ylim = c(min(c(overall_average_MM_pnl, overall_average_Informed_pnl, overall_average_NoisyInformed1_pnl, overall_average_NoisyInformed2_pnl, overall_average_NoisyInformed3_pnl, overall_average_NoisyInformed4_pnl, overall_average_NoisyInformed5_pnl)), max(c(overall_average_MM_pnl, overall_average_Informed_pnl, overall_average_NoisyInformed1_pnl, overall_average_NoisyInformed2_pnl, overall_average_NoisyInformed3_pnl, overall_average_NoisyInformed4_pnl, overall_average_NoisyInformed5_pnl))))
lines(overall_average_Informed_pnl, type = "l", pch = 16, col = "red")
lines(overall_average_NoisyInformed1_pnl, type = "l", pch = 16, col = "green")
lines(overall_average_NoisyInformed2_pnl, type = "l", pch = 16, col = "yellow")
lines(overall_average_NoisyInformed3_pnl, type = "l", pch = 16, col = "blue")
lines(overall_average_NoisyInformed4_pnl, type = "l", pch = 16, col = "purple")
lines(overall_average_NoisyInformed5_pnl, type = "l", pch = 16, col = "orange")

# Add legend
legend("bottomleft", legend = c("Market Maker", "Informed", "Noisy Informed 1", "Noisy Informed 2", "Noisy Informed 3", "Noisy Informed 4", "Noisy Informed 5"), col = c("black", "red", "green", "yellow", "blue", "purple", "orange"), lty = 1, cex = 0.8)

# Initialize matrices to store averages for each position
average_MM_pos <- matrix(NA, nrow = 100, ncol = 10)
average_Informed_pos <- matrix(NA, nrow = 100, ncol = 10)
average_NoisyInformed1_pos <- matrix(NA, nrow = 100, ncol = 10)
average_NoisyInformed2_pos <- matrix(NA, nrow = 100, ncol = 10)
average_NoisyInformed3_pos <- matrix(NA, nrow = 100, ncol = 10)
average_NoisyInformed4_pos <- matrix(NA, nrow = 100, ncol = 10)
average_NoisyInformed5_pos <- matrix(NA, nrow = 100, ncol = 10)

# Loop through each simulation (n)
for (n in 1:10) {

  MM_pos_set7 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_7[n, 7])), ", ")

  Informed_pos_set7 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_7[n, 9])), ", ")
  
  NoisyInformed1_pos_set7 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_7[n, 11])), ", ")
  
  NoisyInformed2_pos_set7 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_7[n, 13])), ", ")
  
  NoisyInformed3_pos_set7 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_7[n, 15])), ", ")
  
  NoisyInformed4_pos_set7 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_7[n, 17])), ", ")
  
  NoisyInformed5_pos_set7 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_7[n, 19])), ", ")
  
  # Loop through each position (i)
  for (i in 1:100) {
    # Extract True and Expected values for the i-th position
    MM_pos <- sapply(MM_pos_set7, function(x) as.numeric(x[i]))
    Informed_pos <- sapply(Informed_pos_set7, function(x) as.numeric(x[i]))
    NoisyInformed1_pos <- sapply(NoisyInformed1_pos_set7, function(x) as.numeric(x[i]))
    NoisyInformed2_pos <- sapply(NoisyInformed2_pos_set7, function(x) as.numeric(x[i]))
    NoisyInformed3_pos <- sapply(NoisyInformed3_pos_set7, function(x) as.numeric(x[i]))
    NoisyInformed4_pos <- sapply(NoisyInformed4_pos_set7, function(x) as.numeric(x[i]))
    NoisyInformed5_pos <- sapply(NoisyInformed5_pos_set7, function(x) as.numeric(x[i]))
    
    # Calculate the average of True and Expected values for the i-th position
    average_MM_pos[i, n] <- mean(MM_pos, na.rm = TRUE)
    average_Informed_pos[i, n] <- mean(Informed_pos, na.rm = TRUE)
    average_NoisyInformed1_pos[i, n] <- mean(NoisyInformed1_pos, na.rm = TRUE)
    average_NoisyInformed2_pos[i, n] <- mean(NoisyInformed2_pos, na.rm = TRUE)
    average_NoisyInformed3_pos[i, n] <- mean(NoisyInformed3_pos, na.rm = TRUE)
    average_NoisyInformed4_pos[i, n] <- mean(NoisyInformed4_pos, na.rm = TRUE)
    average_NoisyInformed5_pos[i, n] <- mean(NoisyInformed5_pos, na.rm = TRUE)
  }
}

# Calculate the overall average for each position across all simulations
overall_average_MM_pos <- rowMeans(average_MM_pos, na.rm = TRUE)
overall_average_Informed_pos <- rowMeans(average_Informed_pos, na.rm = TRUE)
overall_average_NoisyInformed1_pos <- rowMeans(average_NoisyInformed1_pos, na.rm = TRUE)
overall_average_NoisyInformed2_pos <- rowMeans(average_NoisyInformed2_pos, na.rm = TRUE)
overall_average_NoisyInformed3_pos <- rowMeans(average_NoisyInformed3_pos, na.rm = TRUE)
overall_average_NoisyInformed4_pos <- rowMeans(average_NoisyInformed4_pos, na.rm = TRUE)
overall_average_NoisyInformed5_pos <- rowMeans(average_NoisyInformed5_pos, na.rm = TRUE)

# Plot the overall averages
plot(overall_average_MM_pos, type = "l", pch = 16, col = "black", main = "Overall Average Position", xlab = "Position in List", ylab = "Value", ylim = c(min(c(overall_average_MM_pos, overall_average_Informed_pos, overall_average_NoisyInformed1_pos, overall_average_NoisyInformed2_pos, overall_average_NoisyInformed3_pos, overall_average_NoisyInformed4_pos, overall_average_NoisyInformed5_pos)), max(c(overall_average_MM_pos, overall_average_Informed_pos, overall_average_NoisyInformed1_pos, overall_average_NoisyInformed2_pos, overall_average_NoisyInformed3_pos, overall_average_NoisyInformed4_pos, overall_average_NoisyInformed5_pos))))
lines(overall_average_Informed_pos, type = "l", pch = 16, col = "red")
lines(overall_average_NoisyInformed1_pos, type = "l", pch = 16, col = "green")
lines(overall_average_NoisyInformed2_pos, type = "l", pch = 16, col = "yellow")
lines(overall_average_NoisyInformed3_pos, type = "l", pch = 16, col = "blue")
lines(overall_average_NoisyInformed4_pos, type = "l", pch = 16, col = "purple")
lines(overall_average_NoisyInformed5_pos, type = "l", pch = 16, col = "orange")

# Add legend
legend("bottomleft", legend = c("Market Maker", "Informed", "Noisy Informed 1", "Noisy Informed 2", "Noisy Informed 3", "Noisy Informed 4", "Noisy Informed 5"), col = c("black", "red", "green", "yellow", "blue", "purple", "orange"), lty = 1, cex = 0.8)

set8 (1 informed + 2 noisy informed + 3 noisy)

# Initialize matrices to store averages for each position
average_true <- matrix(NA, nrow = 100, ncol = 10)
average_expected <- matrix(NA, nrow = 100, ncol = 10)

# Loop through each simulation (n)
for (n in 1:10) {
  # Extract True values from the aggregated_results_4 dataframe
  TrueValues_set8 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_8[n, 2])), ", ")
  
  # Extract Expected values from the aggregated_results_4 dataframe
  ExpectedValues_set8 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_8[n, 3])), ", ")
  
  # Loop through each position (i)
  for (i in 1:100) {
    # Extract True and Expected values for the i-th position
    True_values <- sapply(TrueValues_set8, function(x) as.numeric(x[i]))
    Expected_values <- sapply(ExpectedValues_set8, function(x) as.numeric(x[i]))
    
    # Calculate the average of True and Expected values for the i-th position
    average_true[i, n] <- mean(True_values, na.rm = TRUE)
    average_expected[i, n] <- mean(Expected_values, na.rm = TRUE)
  }
}

# Calculate the overall average for each position across all simulations
overall_average_true <- rowMeans(average_true, na.rm = TRUE)
overall_average_expected <- rowMeans(average_expected, na.rm = TRUE)

# Plot the overall averages
plot(overall_average_true, type = "l", pch = 16, col = "blue", main = "Overall Average of True vs Expected Values", xlab = "Position in List", ylab = "Value", ylim = c(min(c(overall_average_true, overall_average_expected)), max(c(overall_average_true, overall_average_expected))))
lines(overall_average_expected, type = "l", pch = 16, col = "red")
legend("topright", legend = c("True Values", "Expected Values"), col = c("blue", "red"), lty = 1, cex = 0.8)

# Initialize matrices to store averages for each position
average_bid <- matrix(NA, nrow = 100, ncol = 10)
average_ask <- matrix(NA, nrow = 100, ncol = 10)

# Loop through each simulation (n)
for (n in 1:10) {
  # Extract True values from the aggregated_results_4 dataframe
  Bids_set8 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_8[n, 4])), ", ")
  
  # Extract Expected values from the aggregated_results_4 dataframe
  Asks_set8 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_8[n, 5])), ", ")
  
  # Loop through each position (i)
  for (i in 1:100) {
    # Extract True and Expected values for the i-th position
    Bids <- sapply(Bids_set8, function(x) as.numeric(x[i]))
    Asks <- sapply(Asks_set8, function(x) as.numeric(x[i]))
    
    # Calculate the average of True and Expected values for the i-th position
    average_bid[i, n] <- mean(Bids, na.rm = TRUE)
    average_ask[i, n] <- mean(Asks, na.rm = TRUE)
  }
}

# Calculate the overall average for each position across all simulations
overall_average_bid <- rowMeans(average_bid, na.rm = TRUE)
overall_average_ask <- rowMeans(average_ask, na.rm = TRUE)

# Plot the overall averages
plot(overall_average_bid, type = "l", pch = 16, col = "blue", main = "Overall Average of Bids vs Asks", xlab = "Position in List", ylab = "Value", ylim = c(min(c(overall_average_bid, overall_average_ask)), max(c(overall_average_bid, overall_average_ask))))
lines(overall_average_ask, type = "l", pch = 16, col = "red")
legend("topright", legend = c("Bids", "Asks"), col = c("blue", "red"), lty = 1, cex = 0.8)

# Initialize matrices to store averages for each position
average_bid <- matrix(NA, nrow = 100, ncol = 10)
average_ask <- matrix(NA, nrow = 100, ncol = 10)

# Loop through each simulation (n)
for (n in 1:10) {
  # Extract True values from the aggregated_results_4 dataframe
  Bids_set8 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_8[n, 4])), ", ")
  
  # Extract Expected values from the aggregated_results_4 dataframe
  Asks_set8 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_8[n, 5])), ", ")
  
  # Loop through each position (i)
  for (i in 1:100) {
    # Extract True and Expected values for the i-th position
    Bids <- sapply(Bids_set8, function(x) as.numeric(x[i]))
    Asks <- sapply(Asks_set8, function(x) as.numeric(x[i]))
    
    # Calculate the average of True and Expected values for the i-th position
    average_bid[i, n] <- mean(Bids, na.rm = TRUE)
    average_ask[i, n] <- mean(Asks, na.rm = TRUE)
  }
}

# Calculate the overall average for each position across all simulations
overall_average_bid <- rowMeans(average_bid, na.rm = TRUE)
overall_average_ask <- rowMeans(average_ask, na.rm = TRUE)

## True Value
# Initialize matrices to store averages for each position
average_true <- matrix(NA, nrow = 100, ncol = 10)
average_expected <- matrix(NA, nrow = 100, ncol = 10)

# Loop through each simulation (n)
for (n in 1:10) {
  # Extract True values from the aggregated_results_4 dataframe
  TrueValues_set8 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_8[n, 2])), ", ")
  
  # Extract Expected values from the aggregated_results_4 dataframe
  ExpectedValues_set8 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_8[n, 3])), ", ")
  
  # Loop through each position (i)
  for (i in 1:100) {
    # Extract True and Expected values for the i-th position
    True_values <- sapply(TrueValues_set8, function(x) as.numeric(x[i]))
    Expected_values <- sapply(ExpectedValues_set8, function(x) as.numeric(x[i]))
    
    # Calculate the average of True and Expected values for the i-th position
    average_true[i, n] <- mean(True_values, na.rm = TRUE)
    average_expected[i, n] <- mean(Expected_values, na.rm = TRUE)
  }
}

# Calculate the overall average for each position across all simulations
overall_average_true <- rowMeans(average_true, na.rm = TRUE)
overall_average_expected <- rowMeans(average_expected, na.rm = TRUE)

# Plot the overall averages
#plot(overall_average_true, type = "l", pch = 16, col = "blue", main = "Overall Average of True vs Expected Values", xlab = "Position in List", ylab = "Value", ylim = c(min(c(overall_average_true, overall_average_expected)), max(c(overall_average_true, overall_average_expected))))
#lines(overall_average_expected, type = "l", pch = 16, col = "red")
#legend("topright", legend = c("True Values", "Expected Values"), col = c("blue", "red"), lty = 1, cex = 0.8)

# Plot the overall averages
plot(overall_average_bid, type = "l", pch = 16, col = "blue", main = "Overall Average of Bids vs Asks & True vs Expected Values", xlab = "Position in List", ylab = "Value", ylim = c(min(c(overall_average_bid, overall_average_ask, overall_average_true, overall_average_expected)), max(c(overall_average_bid, overall_average_ask, overall_average_true, overall_average_expected))))
lines(overall_average_ask, type = "l", pch = 16, col = "red")
lines(overall_average_true, type = "l", pch = 16, col = "green")
lines(overall_average_expected, type = "l", pch = 16, col = "purple")
legend("bottomleft", legend = c("Bids", "Asks", "True Value", "Expected Value"), col = c("blue", "red", "green", "purple"), lty = 1, cex = 0.8)

# Initialize matrices to store averages for each position
average_MM_pnl <- matrix(NA, nrow = 100, ncol = 10)
average_Informed_pnl <- matrix(NA, nrow = 100, ncol = 10)
average_NoisyInformed1_pnl <- matrix(NA, nrow = 100, ncol = 10)
average_NoisyInformed2_pnl <- matrix(NA, nrow = 100, ncol = 10)
average_Noisy1_pnl <- matrix(NA, nrow = 100, ncol = 10)
average_Noisy2_pnl <- matrix(NA, nrow = 100, ncol = 10)
average_Noisy3_pnl <- matrix(NA, nrow = 100, ncol = 10)

# Loop through each simulation (n)
for (n in 1:10) {

  MM_pnl_set8 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_8[n, 6])), ", ")

  Informed_pnl_set8 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_8[n, 8])), ", ")
  
  NoisyInformed1_pnl_set8 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_8[n, 10])), ", ")
  
  NoisyInformed2_pnl_set8 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_8[n, 12])), ", ")
  
  Noisy1_pnl_set8 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_8[n, 14])), ", ")
  
  Noisy2_pnl_set8 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_8[n, 16])), ", ")
  
  Noisy3_pnl_set8 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_8[n, 18])), ", ")
  
  # Loop through each position (i)
  for (i in 1:100) {
    # Extract True and Expected values for the i-th position
    MM_pnl <- sapply(MM_pnl_set8, function(x) as.numeric(x[i]))
    Informed_pnl <- sapply(Informed_pnl_set8, function(x) as.numeric(x[i]))
    NoisyInformed1_pnl <- sapply(NoisyInformed1_pnl_set8, function(x) as.numeric(x[i]))
    NoisyInformed2_pnl <- sapply(NoisyInformed2_pnl_set8, function(x) as.numeric(x[i]))
    Noisy1_pnl <- sapply(Noisy1_pnl_set8, function(x) as.numeric(x[i]))
    Noisy2_pnl <- sapply(Noisy2_pnl_set8, function(x) as.numeric(x[i]))
    Noisy3_pnl <- sapply(Noisy3_pnl_set8, function(x) as.numeric(x[i]))
    
    # Calculate the average of True and Expected values for the i-th position
    average_MM_pnl[i, n] <- mean(MM_pnl, na.rm = TRUE)
    average_Informed_pnl[i, n] <- mean(Informed_pnl, na.rm = TRUE)
    average_NoisyInformed1_pnl[i, n] <- mean(NoisyInformed1_pnl, na.rm = TRUE)
    average_NoisyInformed2_pnl[i, n] <- mean(NoisyInformed2_pnl, na.rm = TRUE)
    average_Noisy1_pnl[i, n] <- mean(Noisy1_pnl, na.rm = TRUE)
    average_Noisy2_pnl[i, n] <- mean(Noisy2_pnl, na.rm = TRUE)
    average_Noisy3_pnl[i, n] <- mean(Noisy3_pnl, na.rm = TRUE)
  }
}

# Calculate the overall average for each position across all simulations
overall_average_MM_pnl <- rowMeans(average_MM_pnl, na.rm = TRUE)
overall_average_Informed_pnl <- rowMeans(average_Informed_pnl, na.rm = TRUE)
overall_average_NoisyInformed1_pnl <- rowMeans(average_NoisyInformed1_pnl, na.rm = TRUE)
overall_average_NoisyInformed2_pnl <- rowMeans(average_NoisyInformed2_pnl, na.rm = TRUE)
overall_average_Noisy1_pnl <- rowMeans(average_Noisy1_pnl, na.rm = TRUE)
overall_average_Noisy2_pnl <- rowMeans(average_Noisy2_pnl, na.rm = TRUE)
overall_average_Noisy3_pnl <- rowMeans(average_Noisy3_pnl, na.rm = TRUE)

# Plot the overall averages
plot(overall_average_MM_pnl, type = "l", pch = 16, col = "black", main = "Overall Average PNL", xlab = "Position in List", ylab = "Value", ylim = c(min(c(overall_average_MM_pnl, overall_average_Informed_pnl, overall_average_NoisyInformed1_pnl, overall_average_NoisyInformed2_pnl, overall_average_Noisy1_pnl, overall_average_Noisy2_pnl, overall_average_Noisy3_pnl)), max(c(overall_average_MM_pnl, overall_average_Informed_pnl, overall_average_NoisyInformed1_pnl, overall_average_NoisyInformed2_pnl, overall_average_Noisy1_pnl, overall_average_Noisy2_pnl, overall_average_Noisy3_pnl))))
lines(overall_average_Informed_pnl, type = "l", pch = 16, col = "red")
lines(overall_average_NoisyInformed1_pnl, type = "l", pch = 16, col = "green")
lines(overall_average_NoisyInformed2_pnl, type = "l", pch = 16, col = "yellow")
lines(overall_average_Noisy1_pnl, type = "l", pch = 16, col = "blue")
lines(overall_average_Noisy2_pnl, type = "l", pch = 16, col = "purple")
lines(overall_average_Noisy3_pnl, type = "l", pch = 16, col = "orange")

# Add legend
legend("bottomleft", legend = c("Market Maker", "Informed", "Noisy Informed 1", "Noisy Informed 2", "Noisy 3", "Noisy 4", "Noisy 5"), col = c("black", "red", "green", "yellow", "blue", "purple", "orange"), lty = 1, cex = 0.8)

# Initialize matrices to store averages for each position
average_MM_pnl <- matrix(NA, nrow = 100, ncol = 10)
average_Informed_pnl <- matrix(NA, nrow = 100, ncol = 10)
average_NoisyInformed1_pnl <- matrix(NA, nrow = 100, ncol = 10)
average_NoisyInformed2_pnl <- matrix(NA, nrow = 100, ncol = 10)
average_Noisy1_pnl <- matrix(NA, nrow = 100, ncol = 10)
average_Noisy2_pnl <- matrix(NA, nrow = 100, ncol = 10)
average_Noisy3_pnl <- matrix(NA, nrow = 100, ncol = 10)

# Loop through each simulation (n)
for (n in 1:10) {

  MM_pos_set8 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_8[n, 7])), ", ")

  Informed_pos_set8 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_8[n, 9])), ", ")
  
  NoisyInformed1_pos_set8 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_8[n, 11])), ", ")
  
  NoisyInformed2_pos_set8 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_8[n, 13])), ", ")
  
  Noisy1_pos_set8 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_8[n, 15])), ", ")
  
  Noisy2_pos_set8 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_8[n, 17])), ", ")
  
  Noisy3_pos_set8 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_8[n, 19])), ", ")
  
  # Loop through each position (i)
  for (i in 1:100) {
    # Extract True and Expected values for the i-th position
    MM_pos <- sapply(MM_pos_set8, function(x) as.numeric(x[i]))
    Informed_pos <- sapply(Informed_pos_set8, function(x) as.numeric(x[i]))
    NoisyInformed1_pos <- sapply(NoisyInformed1_pos_set8, function(x) as.numeric(x[i]))
    NoisyInformed2_pos <- sapply(NoisyInformed2_pos_set8, function(x) as.numeric(x[i]))
    Noisy1_pos <- sapply(Noisy1_pos_set8, function(x) as.numeric(x[i]))
    Noisy2_pos <- sapply(Noisy2_pos_set8, function(x) as.numeric(x[i]))
    Noisy3_pos <- sapply(Noisy3_pos_set8, function(x) as.numeric(x[i]))
    
    # Calculate the average of True and Expected values for the i-th position
    average_MM_pos[i, n] <- mean(MM_pos, na.rm = TRUE)
    average_Informed_pos[i, n] <- mean(Informed_pos, na.rm = TRUE)
    average_NoisyInformed1_pos[i, n] <- mean(NoisyInformed1_pos, na.rm = TRUE)
    average_NoisyInformed2_pos[i, n] <- mean(NoisyInformed2_pos, na.rm = TRUE)
    average_Noisy1_pos[i, n] <- mean(Noisy1_pos, na.rm = TRUE)
    average_Noisy2_pos[i, n] <- mean(Noisy2_pos, na.rm = TRUE)
    average_Noisy3_pos[i, n] <- mean(Noisy3_pos, na.rm = TRUE)
  }
}

# Calculate the overall average for each position across all simulations
overall_average_MM_pos <- rowMeans(average_MM_pos, na.rm = TRUE)
overall_average_Informed_pos <- rowMeans(average_Informed_pos, na.rm = TRUE)
overall_average_NoisyInformed1_pos <- rowMeans(average_NoisyInformed1_pos, na.rm = TRUE)
overall_average_NoisyInformed2_pos <- rowMeans(average_NoisyInformed2_pos, na.rm = TRUE)
overall_average_Noisy1_pos <- rowMeans(average_Noisy1_pos, na.rm = TRUE)
overall_average_Noisy2_pos <- rowMeans(average_Noisy2_pos, na.rm = TRUE)
overall_average_Noisy3_pos <- rowMeans(average_Noisy3_pos, na.rm = TRUE)

# Plot the overall averages
plot(overall_average_MM_pos, type = "l", pch = 16, col = "black", main = "Overall Average Position", xlab = "Position in List", ylab = "Value", ylim = c(min(c(overall_average_MM_pos, overall_average_Informed_pos, overall_average_NoisyInformed1_pos, overall_average_NoisyInformed2_pos, overall_average_Noisy1_pos, overall_average_Noisy2_pos, overall_average_Noisy3_pos)), max(c(overall_average_MM_pos, overall_average_Informed_pos, overall_average_NoisyInformed1_pos, overall_average_NoisyInformed2_pos, overall_average_Noisy1_pos, overall_average_Noisy2_pos, overall_average_Noisy3_pos))))
lines(overall_average_Informed_pos, type = "l", pch = 16, col = "red")
lines(overall_average_NoisyInformed1_pos, type = "l", pch = 16, col = "green")
lines(overall_average_NoisyInformed2_pos, type = "l", pch = 16, col = "yellow")
lines(overall_average_Noisy1_pos, type = "l", pch = 16, col = "blue")
lines(overall_average_Noisy2_pos, type = "l", pch = 16, col = "purple")
lines(overall_average_Noisy3_pos, type = "l", pch = 16, col = "orange")

# Add legend
legend("topleft", legend = c("Market Maker", "Informed", "Noisy Informed 1", "Noisy Informed 2", "Noisy 3", "Noisy 4", "Noisy 5"), col = c("black", "red", "green", "yellow", "blue", "purple", "orange"), lty = 1, cex = 0.8)

set9 (Mean Reversion: 6)

# Initialize matrices to store averages for each position
average_true <- matrix(NA, nrow = 100, ncol = 10)
average_expected <- matrix(NA, nrow = 100, ncol = 10)

# Loop through each simulation (n)
for (n in 1:10) {
  # Extract True values from the aggregated_results_4 dataframe
  TrueValues_set9 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_9[n, 2])), ", ")
  
  # Extract Expected values from the aggregated_results_4 dataframe
  ExpectedValues_set9 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_9[n, 3])), ", ")
  
  # Loop through each position (i)
  for (i in 1:100) {
    # Extract True and Expected values for the i-th position
    True_values <- sapply(TrueValues_set9, function(x) as.numeric(x[i]))
    Expected_values <- sapply(ExpectedValues_set9, function(x) as.numeric(x[i]))
    
    # Calculate the average of True and Expected values for the i-th position
    average_true[i, n] <- mean(True_values, na.rm = TRUE)
    average_expected[i, n] <- mean(Expected_values, na.rm = TRUE)
  }
}

# Calculate the overall average for each position across all simulations
overall_average_true <- rowMeans(average_true, na.rm = TRUE)
overall_average_expected <- rowMeans(average_expected, na.rm = TRUE)

# Plot the overall averages
plot(overall_average_true, type = "l", pch = 16, col = "blue", main = "Overall Average of True vs Expected Values", xlab = "Position in List", ylab = "Value", ylim = c(min(c(overall_average_true, overall_average_expected)), max(c(overall_average_true, overall_average_expected))))
lines(overall_average_expected, type = "l", pch = 16, col = "red")
legend("topright", legend = c("True Values", "Expected Values"), col = c("blue", "red"), lty = 1, cex = 0.8)

# Initialize matrices to store averages for each position
average_bid <- matrix(NA, nrow = 100, ncol = 10)
average_ask <- matrix(NA, nrow = 100, ncol = 10)

# Loop through each simulation (n)
for (n in 1:10) {
  # Extract True values from the aggregated_results_4 dataframe
  Bids_set9 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_9[n, 4])), ", ")
  
  # Extract Expected values from the aggregated_results_4 dataframe
  Asks_set9 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_9[n, 5])), ", ")
  
  # Loop through each position (i)
  for (i in 1:100) {
    # Extract True and Expected values for the i-th position
    Bids <- sapply(Bids_set9, function(x) as.numeric(x[i]))
    Asks <- sapply(Asks_set9, function(x) as.numeric(x[i]))
    
    # Calculate the average of True and Expected values for the i-th position
    average_bid[i, n] <- mean(Bids, na.rm = TRUE)
    average_ask[i, n] <- mean(Asks, na.rm = TRUE)
  }
}

# Calculate the overall average for each position across all simulations
overall_average_bid <- rowMeans(average_bid, na.rm = TRUE)
overall_average_ask <- rowMeans(average_ask, na.rm = TRUE)

# Plot the overall averages
plot(overall_average_bid, type = "l", pch = 16, col = "blue", main = "Overall Average of Bids vs Asks", xlab = "Position in List", ylab = "Value", ylim = c(min(c(overall_average_bid, overall_average_ask)), max(c(overall_average_bid, overall_average_ask))))
lines(overall_average_ask, type = "l", pch = 16, col = "red")
legend("topright", legend = c("Bids", "Asks"), col = c("blue", "red"), lty = 1, cex = 0.8)

# Initialize matrices to store averages for each position
average_bid <- matrix(NA, nrow = 100, ncol = 10)
average_ask <- matrix(NA, nrow = 100, ncol = 10)

# Loop through each simulation (n)
for (n in 1:10) {
  # Extract True values from the aggregated_results_4 dataframe
  Bids_set9 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_9[n, 4])), ", ")
  
  # Extract Expected values from the aggregated_results_4 dataframe
  Asks_set9 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_9[n, 5])), ", ")
  
  # Loop through each position (i)
  for (i in 1:100) {
    # Extract True and Expected values for the i-th position
    Bids <- sapply(Bids_set9, function(x) as.numeric(x[i]))
    Asks <- sapply(Asks_set9, function(x) as.numeric(x[i]))
    
    # Calculate the average of True and Expected values for the i-th position
    average_bid[i, n] <- mean(Bids, na.rm = TRUE)
    average_ask[i, n] <- mean(Asks, na.rm = TRUE)
  }
}

# Calculate the overall average for each position across all simulations
overall_average_bid <- rowMeans(average_bid, na.rm = TRUE)
overall_average_ask <- rowMeans(average_ask, na.rm = TRUE)

## True Value
# Initialize matrices to store averages for each position
average_true <- matrix(NA, nrow = 100, ncol = 10)
average_expected <- matrix(NA, nrow = 100, ncol = 10)

# Loop through each simulation (n)
for (n in 1:10) {
  # Extract True values from the aggregated_results_4 dataframe
  TrueValues_set9 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_9[n, 2])), ", ")
  
  # Extract Expected values from the aggregated_results_4 dataframe
  ExpectedValues_set9 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_9[n, 3])), ", ")
  
  # Loop through each position (i)
  for (i in 1:100) {
    # Extract True and Expected values for the i-th position
    True_values <- sapply(TrueValues_set9, function(x) as.numeric(x[i]))
    Expected_values <- sapply(ExpectedValues_set9, function(x) as.numeric(x[i]))
    
    # Calculate the average of True and Expected values for the i-th position
    average_true[i, n] <- mean(True_values, na.rm = TRUE)
    average_expected[i, n] <- mean(Expected_values, na.rm = TRUE)
  }
}

# Calculate the overall average for each position across all simulations
overall_average_true <- rowMeans(average_true, na.rm = TRUE)
overall_average_expected <- rowMeans(average_expected, na.rm = TRUE)

# Plot the overall averages
#plot(overall_average_true, type = "l", pch = 16, col = "blue", main = "Overall Average of True vs Expected Values", xlab = "Position in List", ylab = "Value", ylim = c(min(c(overall_average_true, overall_average_expected)), max(c(overall_average_true, overall_average_expected))))
#lines(overall_average_expected, type = "l", pch = 16, col = "red")
#legend("topright", legend = c("True Values", "Expected Values"), col = c("blue", "red"), lty = 1, cex = 0.8)

# Plot the overall averages
plot(overall_average_bid, type = "l", pch = 16, col = "blue", main = "Overall Average of Bids vs Asks & True vs Expected Values", xlab = "Position in List", ylab = "Value", ylim = c(min(c(overall_average_bid, overall_average_ask, overall_average_true, overall_average_expected)), max(c(overall_average_bid, overall_average_ask, overall_average_true, overall_average_expected))))
lines(overall_average_ask, type = "l", pch = 16, col = "red")
lines(overall_average_true, type = "l", pch = 16, col = "green")
lines(overall_average_expected, type = "l", pch = 16, col = "purple")
legend("bottomleft", legend = c("Bids", "Asks", "True Value", "Expected Value"), col = c("blue", "red", "green", "purple"), lty = 1, cex = 0.8)

# Initialize matrices to store averages for each position
average_MM_pnl <- matrix(NA, nrow = 100, ncol = 10)
average_MR1_pnl <- matrix(NA, nrow = 100, ncol = 10)
average_MR2_pnl <- matrix(NA, nrow = 100, ncol = 10)
average_MR3_pnl <- matrix(NA, nrow = 100, ncol = 10)
average_MR4_pnl <- matrix(NA, nrow = 100, ncol = 10)
average_MR5_pnl <- matrix(NA, nrow = 100, ncol = 10)
average_MR6_pnl <- matrix(NA, nrow = 100, ncol = 10)

# Loop through each simulation (n)
for (n in 1:10) {

  MM_pnl_set9 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_9[n, 6])), ", ")

  MR1_pnl_set9 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_9[n, 8])), ", ")
  
  MR2_pnl_set9 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_9[n, 10])), ", ")
  
  MR3_pnl_set9 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_9[n, 12])), ", ")
  
  MR4_pnl_set9 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_9[n, 14])), ", ")
  
  MR5_pnl_set9 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_9[n, 16])), ", ")
  
  MR6_pnl_set9 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_9[n, 18])), ", ")
  
  # Loop through each position (i)
  for (i in 1:100) {
    # Extract True and Expected values for the i-th position
    MM_pnl <- sapply(MM_pnl_set9, function(x) as.numeric(x[i]))
    MR1_pnl <- sapply(MR1_pnl_set9, function(x) as.numeric(x[i]))
    MR2_pnl <- sapply(MR2_pnl_set9, function(x) as.numeric(x[i]))
    MR3_pnl <- sapply(MR3_pnl_set9, function(x) as.numeric(x[i]))
    MR4_pnl <- sapply(MR4_pnl_set9, function(x) as.numeric(x[i]))
    MR5_pnl <- sapply(MR5_pnl_set9, function(x) as.numeric(x[i]))
    MR6_pnl <- sapply(MR6_pnl_set9, function(x) as.numeric(x[i]))
    
    # Calculate the average of True and Expected values for the i-th position
    average_MM_pnl[i, n] <- mean(MM_pnl, na.rm = TRUE)
    average_MR1_pnl[i, n] <- mean(MR1_pnl, na.rm = TRUE)
    average_MR2_pnl[i, n] <- mean(MR2_pnl, na.rm = TRUE)
    average_MR3_pnl[i, n] <- mean(MR3_pnl, na.rm = TRUE)
    average_MR4_pnl[i, n] <- mean(MR4_pnl, na.rm = TRUE)
    average_MR5_pnl[i, n] <- mean(MR5_pnl, na.rm = TRUE)
    average_MR6_pnl[i, n] <- mean(MR6_pnl, na.rm = TRUE)
  }
}

# Calculate the overall average for each position across all simulations
overall_average_MM_pnl <- rowMeans(average_MM_pnl, na.rm = TRUE)
overall_average_MR1_pnl <- rowMeans(average_MR1_pnl, na.rm = TRUE)
overall_average_MR2_pnl <- rowMeans(average_MR2_pnl, na.rm = TRUE)
overall_average_MR3_pnl <- rowMeans(average_MR3_pnl, na.rm = TRUE)
overall_average_MR4_pnl <- rowMeans(average_MR4_pnl, na.rm = TRUE)
overall_average_MR5_pnl <- rowMeans(average_MR5_pnl, na.rm = TRUE)
overall_average_MR6_pnl <- rowMeans(average_MR6_pnl, na.rm = TRUE)

# Plot the overall averages
plot(overall_average_MM_pnl, type = "l", pch = 16, col = "black", main = "Overall Average PNL", xlab = "Position in List", ylab = "Value", ylim = c(min(c(overall_average_MM_pnl, overall_average_MR1_pnl, overall_average_MR2_pnl, overall_average_MR3_pnl, overall_average_MR4_pnl, overall_average_MR5_pnl, overall_average_MR6_pnl)), max(c(overall_average_MM_pnl, overall_average_MR1_pnl, overall_average_MR2_pnl, overall_average_MR3_pnl, overall_average_MR4_pnl, overall_average_MR5_pnl, overall_average_MR6_pnl))))
lines(overall_average_MR1_pnl, type = "l", pch = 16, col = "red")
lines(overall_average_MR2_pnl, type = "l", pch = 16, col = "green")
lines(overall_average_MR3_pnl, type = "l", pch = 16, col = "yellow")
lines(overall_average_MR4_pnl, type = "l", pch = 16, col = "blue")
lines(overall_average_MR5_pnl, type = "l", pch = 16, col = "purple")
lines(overall_average_MR6_pnl, type = "l", pch = 16, col = "orange")

# Add legend
legend("bottomleft", legend = c("Market Maker", "MR1", "MR2", "MR3", "MR4", "MR5", "MR6"), col = c("black", "red", "green", "yellow", "blue", "purple", "orange"), lty = 1, cex = 0.8)

# Initialize matrices to store averages for each position
average_MM_pos <- matrix(NA, nrow = 100, ncol = 10)
average_MR1_pos <- matrix(NA, nrow = 100, ncol = 10)
average_MR2_pos <- matrix(NA, nrow = 100, ncol = 10)
average_MR3_pos <- matrix(NA, nrow = 100, ncol = 10)
average_MR4_pos <- matrix(NA, nrow = 100, ncol = 10)
average_MR5_pos <- matrix(NA, nrow = 100, ncol = 10)
average_MR6_pos <- matrix(NA, nrow = 100, ncol = 10)

# Loop through each simulation (n)
for (n in 1:10) {

  MM_pos_set9 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_9[n, 7])), ", ")

  MR1_pos_set9 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_9[n, 9])), ", ")
  
  MR2_pos_set9 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_9[n, 11])), ", ")
  
  MR3_pos_set9 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_9[n, 13])), ", ")
  
  MR4_pos_set9 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_9[n, 15])), ", ")
  
  MR5_pos_set9 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_9[n, 17])), ", ")
  
  MR6_pos_set9 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_9[n, 19])), ", ")
  
  # Loop through each position (i)
  for (i in 1:100) {
    # Extract True and Expected values for the i-th position
    MM_pos <- sapply(MM_pos_set9, function(x) as.numeric(x[i]))
    MR1_pos <- sapply(MR1_pos_set9, function(x) as.numeric(x[i]))
    MR2_pos <- sapply(MR2_pos_set9, function(x) as.numeric(x[i]))
    MR3_pos <- sapply(MR3_pos_set9, function(x) as.numeric(x[i]))
    MR4_pos <- sapply(MR4_pos_set9, function(x) as.numeric(x[i]))
    MR5_pos <- sapply(MR5_pos_set9, function(x) as.numeric(x[i]))
    MR6_pos <- sapply(MR6_pos_set9, function(x) as.numeric(x[i]))
    
    # Calculate the average of True and Expected values for the i-th position
    average_MM_pos[i, n] <- mean(MM_pos, na.rm = TRUE)
    average_MR1_pos[i, n] <- mean(MR1_pos, na.rm = TRUE)
    average_MR2_pos[i, n] <- mean(MR2_pos, na.rm = TRUE)
    average_MR3_pos[i, n] <- mean(MR3_pos, na.rm = TRUE)
    average_MR4_pos[i, n] <- mean(MR4_pos, na.rm = TRUE)
    average_MR5_pos[i, n] <- mean(MR5_pos, na.rm = TRUE)
    average_MR6_pos[i, n] <- mean(MR6_pos, na.rm = TRUE)
  }
}

# Calculate the overall average for each position across all simulations
overall_average_MM_pos <- rowMeans(average_MM_pos, na.rm = TRUE)
overall_average_MR1_pos <- rowMeans(average_MR1_pos, na.rm = TRUE)
overall_average_MR2_pos <- rowMeans(average_MR2_pos, na.rm = TRUE)
overall_average_MR3_pos <- rowMeans(average_MR3_pos, na.rm = TRUE)
overall_average_MR4_pos <- rowMeans(average_MR4_pos, na.rm = TRUE)
overall_average_MR5_pos <- rowMeans(average_MR5_pos, na.rm = TRUE)
overall_average_MR6_pos <- rowMeans(average_MR6_pos, na.rm = TRUE)

# Plot the overall averages
plot(overall_average_MM_pos, type = "l", pch = 16, col = "black", main = "Overall Average Position", xlab = "Position in List", ylab = "Value", ylim = c(min(c(overall_average_MM_pos, overall_average_MR1_pos, overall_average_MR2_pos, overall_average_MR3_pos, overall_average_MR4_pos, overall_average_MR5_pos, overall_average_MR6_pos)), max(c(overall_average_MM_pos, overall_average_MR1_pos, overall_average_MR2_pos, overall_average_MR3_pos, overall_average_MR4_pos, overall_average_MR5_pos, overall_average_MR6_pos))))
lines(overall_average_MR1_pos, type = "l", pch = 16, col = "red")
lines(overall_average_MR2_pos, type = "l", pch = 16, col = "green")
lines(overall_average_MR3_pos, type = "l", pch = 16, col = "yellow")
lines(overall_average_MR4_pos, type = "l", pch = 16, col = "blue")
lines(overall_average_MR5_pos, type = "l", pch = 16, col = "purple")
lines(overall_average_MR6_pos, type = "l", pch = 16, col = "orange")

# Add legend
legend("bottomleft", legend = c("Market Maker", "MR1", "MR2", "MR3", "MR4", "MR5", "MR6"), col = c("black", "red", "green", "yellow", "blue", "purple", "orange"), lty = 1, cex = 0.8)

set10 (Mom : 6)

# Initialize matrices to store averages for each position
average_true <- matrix(NA, nrow = 100, ncol = 10)
average_expected <- matrix(NA, nrow = 100, ncol = 10)

# Loop through each simulation (n)
for (n in 1:10) {
  # Extract True values from the aggregated_results_4 dataframe
  TrueValues_set10 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_10[n, 2])), ", ")
  
  # Extract Expected values from the aggregated_results_4 dataframe
  ExpectedValues_set10 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_10[n, 3])), ", ")
  
  # Loop through each position (i)
  for (i in 1:100) {
    # Extract True and Expected values for the i-th position
    True_values <- sapply(TrueValues_set10, function(x) as.numeric(x[i]))
    Expected_values <- sapply(ExpectedValues_set10, function(x) as.numeric(x[i]))
    
    # Calculate the average of True and Expected values for the i-th position
    average_true[i, n] <- mean(True_values, na.rm = TRUE)
    average_expected[i, n] <- mean(Expected_values, na.rm = TRUE)
  }
}

# Calculate the overall average for each position across all simulations
overall_average_true <- rowMeans(average_true, na.rm = TRUE)
overall_average_expected <- rowMeans(average_expected, na.rm = TRUE)

# Plot the overall averages
plot(overall_average_true, type = "l", pch = 16, col = "blue", main = "Overall Average of True vs Expected Values", xlab = "Position in List", ylab = "Value", ylim = c(min(c(overall_average_true, overall_average_expected)), max(c(overall_average_true, overall_average_expected))))
lines(overall_average_expected, type = "l", pch = 16, col = "red")
legend("topright", legend = c("True Values", "Expected Values"), col = c("blue", "red"), lty = 1, cex = 0.8)

# Initialize matrices to store averages for each position
average_bid <- matrix(NA, nrow = 100, ncol = 10)
average_ask <- matrix(NA, nrow = 100, ncol = 10)

# Loop through each simulation (n)
for (n in 1:10) {
  # Extract True values from the aggregated_results_4 dataframe
  Bids_set10 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_10[n, 4])), ", ")
  
  # Extract Expected values from the aggregated_results_4 dataframe
  Asks_set10 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_10[n, 5])), ", ")
  
  # Loop through each position (i)
  for (i in 1:100) {
    # Extract True and Expected values for the i-th position
    Bids <- sapply(Bids_set10, function(x) as.numeric(x[i]))
    Asks <- sapply(Asks_set10, function(x) as.numeric(x[i]))
    
    # Calculate the average of True and Expected values for the i-th position
    average_bid[i, n] <- mean(Bids, na.rm = TRUE)
    average_ask[i, n] <- mean(Asks, na.rm = TRUE)
  }
}

# Calculate the overall average for each position across all simulations
overall_average_bid <- rowMeans(average_bid, na.rm = TRUE)
overall_average_ask <- rowMeans(average_ask, na.rm = TRUE)

# Plot the overall averages
plot(overall_average_bid, type = "l", pch = 16, col = "blue", main = "Overall Average of Bids vs Asks", xlab = "Position in List", ylab = "Value", ylim = c(min(c(overall_average_bid, overall_average_ask)), max(c(overall_average_bid, overall_average_ask))))
lines(overall_average_ask, type = "l", pch = 16, col = "red")
legend("topright", legend = c("Bids", "Asks"), col = c("blue", "red"), lty = 1, cex = 0.8)

# Initialize matrices to store averages for each position
average_bid <- matrix(NA, nrow = 100, ncol = 10)
average_ask <- matrix(NA, nrow = 100, ncol = 10)

# Loop through each simulation (n)
for (n in 1:10) {
  # Extract True values from the aggregated_results_4 dataframe
  Bids_set10 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_10[n, 4])), ", ")
  
  # Extract Expected values from the aggregated_results_4 dataframe
  Asks_set10 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_10[n, 5])), ", ")
  
  # Loop through each position (i)
  for (i in 1:100) {
    # Extract True and Expected values for the i-th position
    Bids <- sapply(Bids_set10, function(x) as.numeric(x[i]))
    Asks <- sapply(Asks_set10, function(x) as.numeric(x[i]))
    
    # Calculate the average of True and Expected values for the i-th position
    average_bid[i, n] <- mean(Bids, na.rm = TRUE)
    average_ask[i, n] <- mean(Asks, na.rm = TRUE)
  }
}

# Calculate the overall average for each position across all simulations
overall_average_bid <- rowMeans(average_bid, na.rm = TRUE)
overall_average_ask <- rowMeans(average_ask, na.rm = TRUE)

## True Value
# Initialize matrices to store averages for each position
average_true <- matrix(NA, nrow = 100, ncol = 10)
average_expected <- matrix(NA, nrow = 100, ncol = 10)

# Loop through each simulation (n)
for (n in 1:10) {
  # Extract True values from the aggregated_results_4 dataframe
  TrueValues_set10 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_10[n, 2])), ", ")
  
  # Extract Expected values from the aggregated_results_4 dataframe
  ExpectedValues_set10 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_10[n, 3])), ", ")
  
  # Loop through each position (i)
  for (i in 1:100) {
    # Extract True and Expected values for the i-th position
    True_values <- sapply(TrueValues_set10, function(x) as.numeric(x[i]))
    Expected_values <- sapply(ExpectedValues_set1, function(x) as.numeric(x[i]))
    
    # Calculate the average of True and Expected values for the i-th position
    average_true[i, n] <- mean(True_values, na.rm = TRUE)
    average_expected[i, n] <- mean(Expected_values, na.rm = TRUE)
  }
}

# Calculate the overall average for each position across all simulations
overall_average_true <- rowMeans(average_true, na.rm = TRUE)
overall_average_expected <- rowMeans(average_expected, na.rm = TRUE)

# Plot the overall averages
#plot(overall_average_true, type = "l", pch = 16, col = "blue", main = "Overall Average of True vs Expected Values", xlab = "Position in List", ylab = "Value", ylim = c(min(c(overall_average_true, overall_average_expected)), max(c(overall_average_true, overall_average_expected))))
#lines(overall_average_expected, type = "l", pch = 16, col = "red")
#legend("topright", legend = c("True Values", "Expected Values"), col = c("blue", "red"), lty = 1, cex = 0.8)

# Plot the overall averages
plot(overall_average_bid, type = "l", pch = 16, col = "blue", main = "Overall Average of Bids vs Asks & True vs Expected Values", xlab = "Position in List", ylab = "Value", ylim = c(min(c(overall_average_bid, overall_average_ask, overall_average_true, overall_average_expected)), max(c(overall_average_bid, overall_average_ask, overall_average_true, overall_average_expected))))
lines(overall_average_ask, type = "l", pch = 16, col = "red")
lines(overall_average_true, type = "l", pch = 16, col = "green")
lines(overall_average_expected, type = "l", pch = 16, col = "purple")
legend("bottomleft", legend = c("Bids", "Asks", "True Value", "Expected Value"), col = c("blue", "red", "green", "purple"), lty = 1, cex = 0.8)

# Initialize matrices to store averages for each position
average_MM_pnl <- matrix(NA, nrow = 100, ncol = 10)
average_Mom1_pnl <- matrix(NA, nrow = 100, ncol = 10)
average_Mom2_pnl <- matrix(NA, nrow = 100, ncol = 10)
average_Mom3_pnl <- matrix(NA, nrow = 100, ncol = 10)
average_Mom4_pnl <- matrix(NA, nrow = 100, ncol = 10)
average_Mom5_pnl <- matrix(NA, nrow = 100, ncol = 10)
average_Mom6_pnl <- matrix(NA, nrow = 100, ncol = 10)

# Loop through each simulation (n)
for (n in 1:10) {

  MM_pnl_set10 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_10[n, 6])), ", ")

  Mom1_pnl_set10 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_10[n, 8])), ", ")
  
  Mom2_pnl_set10 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_10[n, 10])), ", ")
  
  Mom3_pnl_set10 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_10[n, 12])), ", ")
  
  Mom4_pnl_set10 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_10[n, 14])), ", ")
  
  Mom5_pnl_set10 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_10[n, 16])), ", ")
  
  Mom6_pnl_set10 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_10[n, 18])), ", ")
  
  # Loop through each position (i)
  for (i in 1:100) {
    # Extract True and Expected values for the i-th position
    MM_pnl <- sapply(MM_pnl_set10, function(x) as.numeric(x[i]))
    Mom1_pnl <- sapply(Mom1_pnl_set10, function(x) as.numeric(x[i]))
    Mom2_pnl <- sapply(Mom2_pnl_set10, function(x) as.numeric(x[i]))
    Mom3_pnl <- sapply(Mom3_pnl_set10, function(x) as.numeric(x[i]))
    Mom4_pnl <- sapply(Mom4_pnl_set10, function(x) as.numeric(x[i]))
    Mom5_pnl <- sapply(Mom5_pnl_set10, function(x) as.numeric(x[i]))
    Mom6_pnl <- sapply(Mom6_pnl_set10, function(x) as.numeric(x[i]))
    
    # Calculate the average of True and Expected values for the i-th position
    average_MM_pnl[i, n] <- mean(MM_pnl, na.rm = TRUE)
    average_Mom1_pnl[i, n] <- mean(Mom1_pnl, na.rm = TRUE)
    average_Mom2_pnl[i, n] <- mean(Mom2_pnl, na.rm = TRUE)
    average_Mom3_pnl[i, n] <- mean(Mom3_pnl, na.rm = TRUE)
    average_Mom4_pnl[i, n] <- mean(Mom4_pnl, na.rm = TRUE)
    average_Mom5_pnl[i, n] <- mean(Mom5_pnl, na.rm = TRUE)
    average_Mom6_pnl[i, n] <- mean(Mom6_pnl, na.rm = TRUE)
  }
}

# Calculate the overall average for each position across all simulations
overall_average_MM_pnl <- rowMeans(average_MM_pnl, na.rm = TRUE)
overall_average_Mom1_pnl <- rowMeans(average_Mom1_pnl, na.rm = TRUE)
overall_average_Mom2_pnl <- rowMeans(average_Mom2_pnl, na.rm = TRUE)
overall_average_Mom3_pnl <- rowMeans(average_Mom3_pnl, na.rm = TRUE)
overall_average_Mom4_pnl <- rowMeans(average_Mom4_pnl, na.rm = TRUE)
overall_average_Mom5_pnl <- rowMeans(average_Mom5_pnl, na.rm = TRUE)
overall_average_Mom6_pnl <- rowMeans(average_Mom6_pnl, na.rm = TRUE)

# Plot the overall averages
plot(overall_average_MM_pnl, type = "l", pch = 16, col = "black", main = "Overall Average PNL", xlab = "Position in List", ylab = "Value", ylim = c(min(c(overall_average_MM_pnl, overall_average_Mom1_pnl, overall_average_Mom2_pnl, overall_average_Mom3_pnl, overall_average_Mom4_pnl, overall_average_Mom5_pnl, overall_average_Mom6_pnl)), max(c(overall_average_MM_pnl, overall_average_Mom1_pnl, overall_average_Mom2_pnl, overall_average_Mom3_pnl, overall_average_Mom4_pnl, overall_average_Mom5_pnl, overall_average_Mom6_pnl))))
lines(overall_average_Mom1_pnl, type = "l", pch = 16, col = "red")
lines(overall_average_Mom2_pnl, type = "l", pch = 16, col = "green")
lines(overall_average_Mom3_pnl, type = "l", pch = 16, col = "yellow")
lines(overall_average_Mom4_pnl, type = "l", pch = 16, col = "blue")
lines(overall_average_Mom5_pnl, type = "l", pch = 16, col = "purple")
lines(overall_average_Mom6_pnl, type = "l", pch = 16, col = "orange")

# Add legend
legend("topleft", legend = c("Market Maker", "Informed", "Mom1", "Mom2", "Mom3", "Mom4", "Mom5"), col = c("black", "red", "green", "yellow", "blue", "purple", "orange"), lty = 1, cex = 0.8)

# Initialize matrices to store averages for each position
average_MM_pos <- matrix(NA, nrow = 100, ncol = 10)
average_Mom1_pos <- matrix(NA, nrow = 100, ncol = 10)
average_Mom2_pos <- matrix(NA, nrow = 100, ncol = 10)
average_Mom3_pos <- matrix(NA, nrow = 100, ncol = 10)
average_Mom4_pos <- matrix(NA, nrow = 100, ncol = 10)
average_Mom5_pos <- matrix(NA, nrow = 100, ncol = 10)
average_Mom6_pos <- matrix(NA, nrow = 100, ncol = 10)

# Loop through each simulation (n)
for (n in 1:10) {

  MM_pos_set10 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_10[n, 7])), ", ")

  Mom1_pos_set10 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_10[n, 9])), ", ")
  
  Mom2_pos_set10 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_10[n, 11])), ", ")
  
  Mom3_pos_set10 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_10[n, 13])), ", ")
  
  Mom4_pos_set10 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_10[n, 15])), ", ")
  
  Mom5_pos_set10 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_10[n, 17])), ", ")
  
  Mom6_pos_set10 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_10[n, 19])), ", ")
  
  # Loop through each position (i)
  for (i in 1:100) {
    # Extract True and Expected values for the i-th position
    MM_pos <- sapply(MM_pos_set10, function(x) as.numeric(x[i]))
    Mom1_pos <- sapply(Mom1_pos_set10, function(x) as.numeric(x[i]))
    Mom2_pos <- sapply(Mom2_pos_set10, function(x) as.numeric(x[i]))
    Mom3_pos <- sapply(Mom3_pos_set10, function(x) as.numeric(x[i]))
    Mom4_pos <- sapply(Mom4_pos_set10, function(x) as.numeric(x[i]))
    Mom5_pos <- sapply(Mom5_pos_set10, function(x) as.numeric(x[i]))
    Mom6_pos <- sapply(Mom6_pos_set10, function(x) as.numeric(x[i]))
    
    # Calculate the average of True and Expected values for the i-th position
    average_MM_pos[i, n] <- mean(MM_pos, na.rm = TRUE)
    average_Mom1_pos[i, n] <- mean(Mom1_pos, na.rm = TRUE)
    average_Mom2_pos[i, n] <- mean(Mom2_pos, na.rm = TRUE)
    average_Mom3_pos[i, n] <- mean(Mom3_pos, na.rm = TRUE)
    average_Mom4_pos[i, n] <- mean(Mom4_pos, na.rm = TRUE)
    average_Mom5_pos[i, n] <- mean(Mom5_pos, na.rm = TRUE)
    average_Mom6_pos[i, n] <- mean(Mom6_pos, na.rm = TRUE)
  }
}

# Calculate the overall average for each position across all simulations
overall_average_MM_pos <- rowMeans(average_MM_pos, na.rm = TRUE)
overall_average_Mom1_pos <- rowMeans(average_Mom1_pos, na.rm = TRUE)
overall_average_Mom2_pos <- rowMeans(average_Mom2_pos, na.rm = TRUE)
overall_average_Mom3_pos <- rowMeans(average_Mom3_pos, na.rm = TRUE)
overall_average_Mom4_pos <- rowMeans(average_Mom4_pos, na.rm = TRUE)
overall_average_Mom5_pos <- rowMeans(average_Mom5_pos, na.rm = TRUE)
overall_average_Mom6_pos <- rowMeans(average_Mom6_pos, na.rm = TRUE)

# Plot the overall averages
plot(overall_average_MM_pos, type = "l", pch = 16, col = "black", main = "Overall Average Position", xlab = "Position in List", ylab = "Value", ylim = c(min(c(overall_average_MM_pos, overall_average_Mom1_pos, overall_average_Mom2_pos, overall_average_Mom3_pos, overall_average_Mom4_pos, overall_average_Mom5_pos, overall_average_Mom6_pos)), max(c(overall_average_MM_pos, overall_average_Mom1_pos, overall_average_Mom2_pos, overall_average_Mom3_pos, overall_average_Mom4_pos, overall_average_Mom5_pos, overall_average_Mom6_pos))))
lines(overall_average_Mom1_pos, type = "l", pch = 16, col = "red")
lines(overall_average_Mom2_pos, type = "l", pch = 16, col = "green")
lines(overall_average_Mom3_pos, type = "l", pch = 16, col = "yellow")
lines(overall_average_Mom4_pos, type = "l", pch = 16, col = "blue")
lines(overall_average_Mom5_pos, type = "l", pch = 16, col = "purple")
lines(overall_average_Mom6_pos, type = "l", pch = 16, col = "orange")

# Add legend
legend("topleft", legend = c("Market Maker", "Mom1", "Mom2", "Mom3", "Mom4", "Mom5", "Mom6"), col = c("black", "red", "green", "yellow", "blue", "purple", "orange"), lty = 1, cex = 0.8)

set11 (2 informed + 2 noisy informed + 2 noisy)

# Initialize matrices to store averages for each position
average_bid <- matrix(NA, nrow = 100, ncol = 10)
average_ask <- matrix(NA, nrow = 100, ncol = 10)

# Loop through each simulation (n)
for (n in 1:10) {
  # Extract True values from the aggregated_results_4 dataframe
  Bids_set11 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_11[n, 4])), ", ")
  
  # Extract Expected values from the aggregated_results_4 dataframe
  Asks_set11 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_11[n, 5])), ", ")
  
  # Loop through each position (i)
  for (i in 1:100) {
    # Extract True and Expected values for the i-th position
    Bids <- sapply(Bids_set11, function(x) as.numeric(x[i]))
    Asks <- sapply(Asks_set11, function(x) as.numeric(x[i]))
    
    # Calculate the average of True and Expected values for the i-th position
    average_bid[i, n] <- mean(Bids, na.rm = TRUE)
    average_ask[i, n] <- mean(Asks, na.rm = TRUE)
  }
}

# Calculate the overall average for each position across all simulations
overall_average_bid <- rowMeans(average_bid, na.rm = TRUE)
overall_average_ask <- rowMeans(average_ask, na.rm = TRUE)

## True Value
# Initialize matrices to store averages for each position
average_true <- matrix(NA, nrow = 100, ncol = 10)
average_expected <- matrix(NA, nrow = 100, ncol = 10)

# Loop through each simulation (n)
for (n in 1:10) {
  # Extract True values from the aggregated_results_4 dataframe
  TrueValues_set11 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_11[n, 2])), ", ")
  
  # Extract Expected values from the aggregated_results_4 dataframe
  ExpectedValues_set11 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_11[n, 3])), ", ")
  
  # Loop through each position (i)
  for (i in 1:100) {
    # Extract True and Expected values for the i-th position
    True_values <- sapply(TrueValues_set11, function(x) as.numeric(x[i]))
    Expected_values <- sapply(ExpectedValues_set11, function(x) as.numeric(x[i]))
    
    # Calculate the average of True and Expected values for the i-th position
    average_true[i, n] <- mean(True_values, na.rm = TRUE)
    average_expected[i, n] <- mean(Expected_values, na.rm = TRUE)
  }
}

# Calculate the overall average for each position across all simulations
overall_average_true <- rowMeans(average_true, na.rm = TRUE)
overall_average_expected <- rowMeans(average_expected, na.rm = TRUE)

# Plot the overall averages
#plot(overall_average_true, type = "l", pch = 16, col = "blue", main = "Overall Average of True vs Expected Values", xlab = "Position in List", ylab = "Value", ylim = c(min(c(overall_average_true, overall_average_expected)), max(c(overall_average_true, overall_average_expected))))
#lines(overall_average_expected, type = "l", pch = 16, col = "red")
#legend("topright", legend = c("True Values", "Expected Values"), col = c("blue", "red"), lty = 1, cex = 0.8)

# Plot the overall averages
plot(overall_average_bid, type = "l", pch = 16, col = "blue", main = "Overall Average of Bids vs Asks & True vs Expected Values", xlab = "Position in List", ylab = "Value", ylim = c(min(c(overall_average_bid, overall_average_ask, overall_average_true, overall_average_expected)), max(c(overall_average_bid, overall_average_ask, overall_average_true, overall_average_expected))))
lines(overall_average_ask, type = "l", pch = 16, col = "red")
lines(overall_average_true, type = "l", pch = 16, col = "green")
lines(overall_average_expected, type = "l", pch = 16, col = "purple")
legend("bottomleft", legend = c("Bids", "Asks", "True Value", "Expected Value"), col = c("blue", "red", "green", "purple"), lty = 1, cex = 0.8)

# Initialize matrices to store averages for each position
average_MM_pnl <- matrix(NA, nrow = 100, ncol = 10)
average_Informed1_pnl <- matrix(NA, nrow = 100, ncol = 10)
average_Informed2_pnl <- matrix(NA, nrow = 100, ncol = 10)
average_NoisyInformed1_pnl <- matrix(NA, nrow = 100, ncol = 10)
average_NoisyInformed2_pnl <- matrix(NA, nrow = 100, ncol = 10)
average_Noisy1_pnl <- matrix(NA, nrow = 100, ncol = 10)
average_Noisy2_pnl <- matrix(NA, nrow = 100, ncol = 10)

# Loop through each simulation (n)
for (n in 1:10) {

  MM_pnl_set11 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_11[n, 6])), ", ")

  Informed1_pnl_set11 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_11[n, 8])), ", ")
  
  Informed2_pnl_set11 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_11[n, 10])), ", ")
  
  NoisyInformed1_pnl_set11 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_11[n, 12])), ", ")
  
  NoisyInformed2_pnl_set11 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_11[n, 14])), ", ")
  
  Noisy1_pnl_set11 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_11[n, 16])), ", ")
  
  Noisy2_pnl_set11 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_11[n, 18])), ", ")
  
  # Loop through each position (i)
  for (i in 1:100) {
    # Extract True and Expected values for the i-th position
    MM_pnl <- sapply(MM_pnl_set11, function(x) as.numeric(x[i]))
    Informed1_pnl <- sapply(Informed1_pnl_set11, function(x) as.numeric(x[i]))
    Informed2_pnl <- sapply(Informed2_pnl_set11, function(x) as.numeric(x[i]))
    NoisyInformed1_pnl <- sapply(NoisyInformed1_pnl_set11, function(x) as.numeric(x[i]))
    NoisyInformed1_pnl <- sapply(NoisyInformed2_pnl_set11, function(x) as.numeric(x[i]))
    Noisy1_pnl <- sapply(Noisy1_pnl_set11, function(x) as.numeric(x[i]))
    Noisy2_pnl <- sapply(Noisy2_pnl_set11, function(x) as.numeric(x[i]))
    
    # Calculate the average of True and Expected values for the i-th position
    average_MM_pnl[i, n] <- mean(MM_pnl, na.rm = TRUE)
    average_Informed1_pnl[i, n] <- mean(Informed1_pnl, na.rm = TRUE)
    average_Informed2_pnl[i, n] <- mean(Informed2_pnl, na.rm = TRUE)
    average_NoisyInformed1_pnl[i, n] <- mean(NoisyInformed1_pnl, na.rm = TRUE)
    average_NoisyInformed2_pnl[i, n] <- mean(NoisyInformed2_pnl, na.rm = TRUE)
    average_Noisy1_pnl[i, n] <- mean(Noisy1_pnl, na.rm = TRUE)
    average_Noisy2_pnl[i, n] <- mean(Noisy2_pnl, na.rm = TRUE)
  }
}

# Calculate the overall average for each position across all simulations
overall_average_MM_pnl <- rowMeans(average_MM_pnl, na.rm = TRUE)
overall_average_Informed1_pnl <- rowMeans(average_Informed1_pnl, na.rm = TRUE)
overall_average_Informed2_pnl <- rowMeans(average_Informed2_pnl, na.rm = TRUE)
overall_average_NoisyInformed1_pnl <- rowMeans(average_NoisyInformed1_pnl, na.rm = TRUE)
overall_average_NoisyInformed2_pnl <- rowMeans(average_NoisyInformed2_pnl, na.rm = TRUE)
overall_average_Noisy1_pnl <- rowMeans(average_Noisy1_pnl, na.rm = TRUE)
overall_average_Noisy2_pnl <- rowMeans(average_Noisy2_pnl, na.rm = TRUE)

# Plot the overall averages
plot(overall_average_MM_pnl, type = "l", pch = 16, col = "black", main = "Overall Average PNL", xlab = "Position in List", ylab = "Value", ylim = c(min(c(overall_average_MM_pnl, overall_average_Informed1_pnl, overall_average_Informed2_pnl, overall_average_NoisyInformed1_pnl, overall_average_NoisyInformed2_pnl, overall_average_Noisy1_pnl, overall_average_Noisy2_pnl)), max(c(overall_average_MM_pnl, overall_average_Informed1_pnl, overall_average_Informed2_pnl, overall_average_NoisyInformed1_pnl, overall_average_NoisyInformed2_pnl, overall_average_Noisy1_pnl, overall_average_Noisy2_pnl))))
lines(overall_average_Informed1_pnl, type = "l", pch = 16, col = "red")
lines(overall_average_Informed2_pnl, type = "l", pch = 16, col = "green")
lines(overall_average_NoisyInformed1_pnl, type = "l", pch = 16, col = "yellow")
lines(overall_average_NoisyInformed2_pnl, type = "l", pch = 16, col = "blue")
lines(overall_average_Noisy1_pnl, type = "l", pch = 16, col = "purple")
lines(overall_average_Noisy2_pnl, type = "l", pch = 16, col = "orange")

# Add legend
legend("bottomleft", legend = c("Market Maker", "Informed 1", "Informed 2", "Noisy Informed 1", "Noisy Informed 2", "Noisy 1", "Noisy 2"), col = c("black", "red", "green", "yellow", "blue", "purple", "orange"), lty = 1, cex = 0.8)

# Initialize matrices to store averages for each position
average_MM_pos <- matrix(NA, nrow = 100, ncol = 10)
average_Informed1_pos <- matrix(NA, nrow = 100, ncol = 10)
average_Informed2_pos <- matrix(NA, nrow = 100, ncol = 10)
average_NoisyInformed1_pos <- matrix(NA, nrow = 100, ncol = 10)
average_NoisyInformed2_pos <- matrix(NA, nrow = 100, ncol = 10)
average_Noisy1_pos <- matrix(NA, nrow = 100, ncol = 10)
average_Noisy2_pos <- matrix(NA, nrow = 100, ncol = 10)

# Loop through each simulation (n)
for (n in 1:10) {

  MM_pos_set11 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_11[n, 7])), ", ")

  Informed1_pos_set11 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_11[n, 9])), ", ")
  
  Informed2_pos_set11 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_11[n, 11])), ", ")
  
  NoisyInformed1_pos_set11 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_11[n, 13])), ", ")
  
  NoisyInformed2_pos_set11 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_11[n, 15])), ", ")
  
  Noisy1_pos_set11 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_11[n, 17])), ", ")
  
  Noisy2_pos_set11 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_11[n, 19])), ", ")
  
  # Loop through each position (i)
  for (i in 1:100) {
    # Extract True and Expected values for the i-th position
    MM_pos <- sapply(MM_pnl_set11, function(x) as.numeric(x[i]))
    Informed1_pos <- sapply(Informed1_pos_set11, function(x) as.numeric(x[i]))
    Informed2_pos <- sapply(Informed2_pos_set11, function(x) as.numeric(x[i]))
    NoisyInformed1_pos <- sapply(NoisyInformed1_pos_set11, function(x) as.numeric(x[i]))
    NoisyInformed1_pos <- sapply(NoisyInformed2_pos_set11, function(x) as.numeric(x[i]))
    Noisy1_pos <- sapply(Noisy1_pos_set11, function(x) as.numeric(x[i]))
    Noisy2_pos <- sapply(Noisy2_pos_set11, function(x) as.numeric(x[i]))
    
    # Calculate the average of True and Expected values for the i-th position
    average_MM_pos[i, n] <- mean(MM_pos, na.rm = TRUE)
    average_Informed1_pos[i, n] <- mean(Informed1_pos, na.rm = TRUE)
    average_Informed2_pos[i, n] <- mean(Informed2_pos, na.rm = TRUE)
    average_NoisyInformed1_pos[i, n] <- mean(NoisyInformed1_pos, na.rm = TRUE)
    average_NoisyInformed2_pos[i, n] <- mean(NoisyInformed2_pos, na.rm = TRUE)
    average_Noisy1_pos[i, n] <- mean(Noisy1_pos, na.rm = TRUE)
    average_Noisy2_pos[i, n] <- mean(Noisy2_pos, na.rm = TRUE)
  }
}

# Calculate the overall average for each position across all simulations
overall_average_MM_pos <- rowMeans(average_MM_pos, na.rm = TRUE)
overall_average_Informed1_pos <- rowMeans(average_Informed1_pos, na.rm = TRUE)
overall_average_Informed2_pos <- rowMeans(average_Informed2_pos, na.rm = TRUE)
overall_average_NoisyInformed1_pos <- rowMeans(average_NoisyInformed1_pos, na.rm = TRUE)
overall_average_NoisyInformed2_pos <- rowMeans(average_NoisyInformed2_pos, na.rm = TRUE)
overall_average_Noisy1_pos <- rowMeans(average_Noisy1_pos, na.rm = TRUE)
overall_average_Noisy2_pos <- rowMeans(average_Noisy2_pos, na.rm = TRUE)

# Plot the overall averages
plot(overall_average_MM_pos, type = "l", pch = 16, col = "black", main = "Overall Average Position", xlab = "Position in List", ylab = "Value", ylim = c(min(c(overall_average_MM_pos, overall_average_Informed1_pos, overall_average_Informed2_pos, overall_average_NoisyInformed1_pos, overall_average_NoisyInformed2_pos, overall_average_Noisy1_pos, overall_average_Noisy2_pos)), max(c(overall_average_MM_pos, overall_average_Informed1_pos, overall_average_Informed2_pos, overall_average_NoisyInformed1_pos, overall_average_NoisyInformed2_pos, overall_average_Noisy1_pos, overall_average_Noisy2_pos))))
lines(overall_average_Informed1_pos, type = "l", pch = 16, col = "red")
lines(overall_average_Informed2_pos, type = "l", pch = 16, col = "green")
lines(overall_average_NoisyInformed1_pos, type = "l", pch = 16, col = "yellow")
lines(overall_average_NoisyInformed2_pos, type = "l", pch = 16, col = "blue")
lines(overall_average_Noisy1_pos, type = "l", pch = 16, col = "purple")
lines(overall_average_Noisy2_pos, type = "l", pch = 16, col = "orange")

# Add legend
legend("bottomleft", legend = c("Market Maker", "Informed 1", "Informed 2", "Noisy Informed 1", "Noisy Informed 2", "Noisy 1", "Noisy 2"), col = c("black", "red", "green", "yellow", "blue", "purple", "orange"), lty = 1, cex = 0.8)

set12 (6 Stochastic Noisy)

# Initialize matrices to store averages for each position
average_bid <- matrix(NA, nrow = 100, ncol = 10)
average_ask <- matrix(NA, nrow = 100, ncol = 10)

# Loop through each simulation (n)
for (n in 1:10) {
  # Extract True values from the aggregated_results_4 dataframe
  Bids_set12 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_12[n, 4])), ", ")
  
  # Extract Expected values from the aggregated_results_4 dataframe
  Asks_set12 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_12[n, 5])), ", ")
  
  # Loop through each position (i)
  for (i in 1:100) {
    # Extract True and Expected values for the i-th position
    Bids <- sapply(Bids_set12, function(x) as.numeric(x[i]))
    Asks <- sapply(Asks_set12, function(x) as.numeric(x[i]))
    
    # Calculate the average of True and Expected values for the i-th position
    average_bid[i, n] <- mean(Bids, na.rm = TRUE)
    average_ask[i, n] <- mean(Asks, na.rm = TRUE)
  }
}

# Calculate the overall average for each position across all simulations
overall_average_bid <- rowMeans(average_bid, na.rm = TRUE)
overall_average_ask <- rowMeans(average_ask, na.rm = TRUE)

## True Value
# Initialize matrices to store averages for each position
average_true <- matrix(NA, nrow = 100, ncol = 10)
average_expected <- matrix(NA, nrow = 100, ncol = 10)

# Loop through each simulation (n)
for (n in 1:10) {
  # Extract True values from the aggregated_results_4 dataframe
  TrueValues_set12 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_12[n, 2])), ", ")
  
  # Extract Expected values from the aggregated_results_4 dataframe
  ExpectedValues_set12 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_12[n, 3])), ", ")
  
  # Loop through each position (i)
  for (i in 1:100) {
    # Extract True and Expected values for the i-th position
    True_values <- sapply(TrueValues_set12, function(x) as.numeric(x[i]))
    Expected_values <- sapply(ExpectedValues_set12, function(x) as.numeric(x[i]))
    
    # Calculate the average of True and Expected values for the i-th position
    average_true[i, n] <- mean(True_values, na.rm = TRUE)
    average_expected[i, n] <- mean(Expected_values, na.rm = TRUE)
  }
}

# Calculate the overall average for each position across all simulations
overall_average_true <- rowMeans(average_true, na.rm = TRUE)
overall_average_expected <- rowMeans(average_expected, na.rm = TRUE)

# Plot the overall averages
#plot(overall_average_true, type = "l", pch = 16, col = "blue", main = "Overall Average of True vs Expected Values", xlab = "Position in List", ylab = "Value", ylim = c(min(c(overall_average_true, overall_average_expected)), max(c(overall_average_true, overall_average_expected))))
#lines(overall_average_expected, type = "l", pch = 16, col = "red")
#legend("topright", legend = c("True Values", "Expected Values"), col = c("blue", "red"), lty = 1, cex = 0.8)

# Plot the overall averages
plot(overall_average_bid, type = "l", pch = 16, col = "blue", main = "Overall Average of Bids vs Asks & True vs Expected Values", xlab = "Position in List", ylab = "Value", ylim = c(min(c(overall_average_bid, overall_average_ask, overall_average_true, overall_average_expected)), max(c(overall_average_bid, overall_average_ask, overall_average_true, overall_average_expected))))
lines(overall_average_ask, type = "l", pch = 16, col = "red")
lines(overall_average_true, type = "l", pch = 16, col = "green")
lines(overall_average_expected, type = "l", pch = 16, col = "purple")
legend("bottomleft", legend = c("Bids", "Asks", "True Value", "Expected Value"), col = c("blue", "red", "green", "purple"), lty = 1, cex = 0.8)

# Initialize matrices to store averages for each position
average_MM_pnl <- matrix(NA, nrow = 100, ncol = 10)
average_StochNoisy1_pnl <- matrix(NA, nrow = 100, ncol = 10)
average_StochNoisy2_pnl <- matrix(NA, nrow = 100, ncol = 10)
average_StochNoisy3_pnl <- matrix(NA, nrow = 100, ncol = 10)
average_StochNoisy4_pnl <- matrix(NA, nrow = 100, ncol = 10)
average_StochNoisy5_pnl <- matrix(NA, nrow = 100, ncol = 10)
average_StochNoisy6_pnl <- matrix(NA, nrow = 100, ncol = 10)

# Loop through each simulation (n)
for (n in 1:10) {

  MM_pnl_set12 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_12[n, 6])), ", ")

  StochNoisy1_pnl_set12 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_12[n, 8])), ", ")
  
  StochNoisy2_pnl_set12 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_12[n, 10])), ", ")
  
  StochNoisy3_pnl_set12 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_12[n, 12])), ", ")
  
  StochNoisy4_pnl_set12 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_12[n, 14])), ", ")
  
  StochNoisy5_pnl_set12 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_12[n, 16])), ", ")
  
  StochNoisy6_pnl_set12 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_12[n, 18])), ", ")
  
  # Loop through each position (i)
  for (i in 1:100) {
    # Extract True and Expected values for the i-th position
    MM_pnl <- sapply(MM_pnl_set12, function(x) as.numeric(x[i]))
    StochNoisy1_pnl <- sapply(StochNoisy1_pnl_set12, function(x) as.numeric(x[i]))
    StochNoisy2_pnl <- sapply(StochNoisy2_pnl_set12, function(x) as.numeric(x[i]))
    StochNoisy3_pnl <- sapply(StochNoisy3_pnl_set12, function(x) as.numeric(x[i]))
    StochNoisy4_pnl <- sapply(StochNoisy4_pnl_set12, function(x) as.numeric(x[i]))
    StochNoisy5_pnl <- sapply(StochNoisy5_pnl_set12, function(x) as.numeric(x[i]))
    StochNoisy6_pnl <- sapply(StochNoisy6_pnl_set12, function(x) as.numeric(x[i]))
    
    # Calculate the average of True and Expected values for the i-th position
    average_MM_pnl[i, n] <- mean(MM_pnl, na.rm = TRUE)
    average_StochNoisy1_pnl[i, n] <- mean(StochNoisy1_pnl, na.rm = TRUE)
    average_StochNoisy2_pnl[i, n] <- mean(StochNoisy2_pnl, na.rm = TRUE)
    average_StochNoisy3_pnl[i, n] <- mean(StochNoisy3_pnl, na.rm = TRUE)
    average_StochNoisy4_pnl[i, n] <- mean(StochNoisy4_pnl, na.rm = TRUE)
    average_StochNoisy5_pnl[i, n] <- mean(StochNoisy5_pnl, na.rm = TRUE)
    average_StochNoisy6_pnl[i, n] <- mean(StochNoisy6_pnl, na.rm = TRUE)
  }
}

# Calculate the overall average for each position across all simulations
overall_average_MM_pnl <- rowMeans(average_MM_pnl, na.rm = TRUE)
overall_average_StochNoisy1_pnl <- rowMeans(average_StochNoisy1_pnl, na.rm = TRUE)
overall_average_StochNoisy2_pnl <- rowMeans(average_StochNoisy2_pnl, na.rm = TRUE)
overall_average_StochNoisy3_pnl <- rowMeans(average_StochNoisy3_pnl, na.rm = TRUE)
overall_average_StochNoisy4_pnl <- rowMeans(average_StochNoisy4_pnl, na.rm = TRUE)
overall_average_StochNoisy5_pnl <- rowMeans(average_StochNoisy5_pnl, na.rm = TRUE)
overall_average_StochNoisy6_pnl <- rowMeans(average_StochNoisy6_pnl, na.rm = TRUE)

# Plot the overall averages
plot(overall_average_MM_pnl, type = "l", pch = 16, col = "black", main = "Overall Average PNL", xlab = "Position in List", ylab = "Value", ylim = c(min(c(overall_average_MM_pnl, overall_average_StochNoisy1_pnl, overall_average_StochNoisy2_pnl, overall_average_StochNoisy3_pnl, overall_average_StochNoisy4_pnl, overall_average_StochNoisy5_pnl, overall_average_StochNoisy6_pnl)), max(c(overall_average_MM_pnl, overall_average_StochNoisy1_pnl, overall_average_StochNoisy2_pnl, overall_average_StochNoisy3_pnl, overall_average_StochNoisy4_pnl, overall_average_StochNoisy5_pnl, overall_average_StochNoisy6_pnl))))
lines(overall_average_StochNoisy1_pnl, type = "l", pch = 16, col = "red")
lines(overall_average_StochNoisy2_pnl, type = "l", pch = 16, col = "green")
lines(overall_average_StochNoisy3_pnl, type = "l", pch = 16, col = "yellow")
lines(overall_average_StochNoisy4_pnl, type = "l", pch = 16, col = "blue")
lines(overall_average_StochNoisy5_pnl, type = "l", pch = 16, col = "purple")
lines(overall_average_StochNoisy6_pnl, type = "l", pch = 16, col = "orange")

# Add legend
legend("topleft", legend = c("Market Maker", "Stochactic Noisy 1", "Stochactic Noisy 2", "Stochactic Noisy 3", "Stochactic Noisy 4", "Stochactic Noisy 5", "Stochactic Noisy 6"), col = c("black", "red", "green", "yellow", "blue", "purple", "orange"), lty = 1, cex = 0.8)

# Initialize matrices to store averages for each position
average_MM_pos <- matrix(NA, nrow = 100, ncol = 10)
average_StochNoisy1_pos <- matrix(NA, nrow = 100, ncol = 10)
average_StochNoisy2_pos <- matrix(NA, nrow = 100, ncol = 10)
average_StochNoisy3_pos <- matrix(NA, nrow = 100, ncol = 10)
average_StochNoisy4_pos <- matrix(NA, nrow = 100, ncol = 10)
average_StochNoisy5_pos <- matrix(NA, nrow = 100, ncol = 10)
average_StochNoisy6_pos <- matrix(NA, nrow = 100, ncol = 10)

# Loop through each simulation (n)
for (n in 1:10) {

  MM_pos_set12 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_12[n, 7])), ", ")

  StochNoisy1_pos_set12 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_12[n, 9])), ", ")
  
  StochNoisy2_pos_set12 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_12[n, 11])), ", ")
  
  StochNoisy3_pos_set12 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_12[n, 13])), ", ")
  
  StochNoisy4_pos_set12 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_12[n, 15])), ", ")
  
  StochNoisy5_pos_set12 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_12[n, 17])), ", ")
  
  StochNoisy6_pos_set12 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_12[n, 19])), ", ")
  
  # Loop through each position (i)
  for (i in 1:100) {
    # Extract True and Expected values for the i-th position
    MM_pos <- sapply(MM_pos_set12, function(x) as.numeric(x[i]))
    StochNoisy1_pos <- sapply(StochNoisy1_pos_set12, function(x) as.numeric(x[i]))
    StochNoisy2_pos <- sapply(StochNoisy2_pos_set12, function(x) as.numeric(x[i]))
    StochNoisy3_pos <- sapply(StochNoisy3_pos_set12, function(x) as.numeric(x[i]))
    StochNoisy4_pos <- sapply(StochNoisy4_pos_set12, function(x) as.numeric(x[i]))
    StochNoisy5_pos <- sapply(StochNoisy5_pos_set12, function(x) as.numeric(x[i]))
    StochNoisy6_pos <- sapply(StochNoisy6_pos_set12, function(x) as.numeric(x[i]))
    
    # Calculate the average of True and Expected values for the i-th position
    average_MM_pos[i, n] <- mean(MM_pos, na.rm = TRUE)
    average_StochNoisy1_pos[i, n] <- mean(StochNoisy1_pos, na.rm = TRUE)
    average_StochNoisy2_pos[i, n] <- mean(StochNoisy2_pos, na.rm = TRUE)
    average_StochNoisy3_pos[i, n] <- mean(StochNoisy3_pos, na.rm = TRUE)
    average_StochNoisy4_pos[i, n] <- mean(StochNoisy4_pos, na.rm = TRUE)
    average_StochNoisy5_pos[i, n] <- mean(StochNoisy5_pos, na.rm = TRUE)
    average_StochNoisy6_pos[i, n] <- mean(StochNoisy6_pos, na.rm = TRUE)
  }
}

# Calculate the overall average for each position across all simulations
overall_average_MM_pos <- rowMeans(average_MM_pos, na.rm = TRUE)
overall_average_StochNoisy1_pos <- rowMeans(average_StochNoisy1_pos, na.rm = TRUE)
overall_average_StochNoisy2_pos <- rowMeans(average_StochNoisy2_pos, na.rm = TRUE)
overall_average_StochNoisy3_pos <- rowMeans(average_StochNoisy3_pos, na.rm = TRUE)
overall_average_StochNoisy4_pos <- rowMeans(average_StochNoisy4_pos, na.rm = TRUE)
overall_average_StochNoisy5_pos <- rowMeans(average_StochNoisy5_pos, na.rm = TRUE)
overall_average_StochNoisy6_pos <- rowMeans(average_StochNoisy6_pos, na.rm = TRUE)

# Plot the overall averages
plot(overall_average_MM_pos, type = "l", pch = 16, col = "black", main = "Overall Average Position", xlab = "Position in List", ylab = "Value", ylim = c(min(c(overall_average_MM_pos, overall_average_StochNoisy1_pos, overall_average_StochNoisy2_pos, overall_average_StochNoisy3_pos, overall_average_StochNoisy4_pos, overall_average_StochNoisy5_pos, overall_average_StochNoisy6_pos)), max(c(overall_average_MM_pos, overall_average_StochNoisy1_pos, overall_average_StochNoisy2_pos, overall_average_StochNoisy3_pos, overall_average_StochNoisy4_pos, overall_average_StochNoisy5_pos, overall_average_StochNoisy6_pos))))
lines(overall_average_StochNoisy1_pos, type = "l", pch = 16, col = "red")
lines(overall_average_StochNoisy2_pos, type = "l", pch = 16, col = "green")
lines(overall_average_StochNoisy3_pos, type = "l", pch = 16, col = "yellow")
lines(overall_average_StochNoisy4_pos, type = "l", pch = 16, col = "blue")
lines(overall_average_StochNoisy5_pos, type = "l", pch = 16, col = "purple")
lines(overall_average_StochNoisy6_pos, type = "l", pch = 16, col = "orange")

# Add legend
legend("topleft", legend = c("Market Maker", "Stochastic Noisy 1", "Stochastic Noisy 2", "Stochastic Noisy 3", "Stochastic Noisy 4", "Stochastic Noisy 5", "Stochastic Noisy 6"), col = c("black", "red", "green", "yellow", "blue", "purple", "orange"), lty = 1, cex = 0.8)

set13 (6 noisy informed)

# Initialize matrices to store averages for each position
average_bid <- matrix(NA, nrow = 100, ncol = 10)
average_ask <- matrix(NA, nrow = 100, ncol = 10)

# Loop through each simulation (n)
for (n in 1:10) {
  # Extract True values from the aggregated_results_4 dataframe
  Bids_set13 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_13[n, 4])), ", ")
  
  # Extract Expected values from the aggregated_results_4 dataframe
  Asks_set13 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_13[n, 5])), ", ")
  
  # Loop through each position (i)
  for (i in 1:100) {
    # Extract True and Expected values for the i-th position
    Bids <- sapply(Bids_set13, function(x) as.numeric(x[i]))
    Asks <- sapply(Asks_set13, function(x) as.numeric(x[i]))
    
    # Calculate the average of True and Expected values for the i-th position
    average_bid[i, n] <- mean(Bids, na.rm = TRUE)
    average_ask[i, n] <- mean(Asks, na.rm = TRUE)
  }
}

# Calculate the overall average for each position across all simulations
overall_average_bid <- rowMeans(average_bid, na.rm = TRUE)
overall_average_ask <- rowMeans(average_ask, na.rm = TRUE)

## True Value
# Initialize matrices to store averages for each position
average_true <- matrix(NA, nrow = 100, ncol = 10)
average_expected <- matrix(NA, nrow = 100, ncol = 10)

# Loop through each simulation (n)
for (n in 1:10) {
  # Extract True values from the aggregated_results_4 dataframe
  TrueValues_set13 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_13[n, 2])), ", ")
  
  # Extract Expected values from the aggregated_results_4 dataframe
  ExpectedValues_set13 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_13[n, 3])), ", ")
  
  # Loop through each position (i)
  for (i in 1:100) {
    # Extract True and Expected values for the i-th position
    True_values <- sapply(TrueValues_set13, function(x) as.numeric(x[i]))
    Expected_values <- sapply(ExpectedValues_set13, function(x) as.numeric(x[i]))
    
    # Calculate the average of True and Expected values for the i-th position
    average_true[i, n] <- mean(True_values, na.rm = TRUE)
    average_expected[i, n] <- mean(Expected_values, na.rm = TRUE)
  }
}

# Calculate the overall average for each position across all simulations
overall_average_true <- rowMeans(average_true, na.rm = TRUE)
overall_average_expected <- rowMeans(average_expected, na.rm = TRUE)

# Plot the overall averages
#plot(overall_average_true, type = "l", pch = 16, col = "blue", main = "Overall Average of True vs Expected Values", xlab = "Position in List", ylab = "Value", ylim = c(min(c(overall_average_true, overall_average_expected)), max(c(overall_average_true, overall_average_expected))))
#lines(overall_average_expected, type = "l", pch = 16, col = "red")
#legend("topright", legend = c("True Values", "Expected Values"), col = c("blue", "red"), lty = 1, cex = 0.8)

# Plot the overall averages
plot(overall_average_bid, type = "l", pch = 16, col = "blue", main = "Overall Average of Bids vs Asks & True vs Expected Values", xlab = "Position in List", ylab = "Value", ylim = c(min(c(overall_average_bid, overall_average_ask, overall_average_true, overall_average_expected)), max(c(overall_average_bid, overall_average_ask, overall_average_true, overall_average_expected))))
lines(overall_average_ask, type = "l", pch = 16, col = "red")
lines(overall_average_true, type = "l", pch = 16, col = "green")
lines(overall_average_expected, type = "l", pch = 16, col = "purple")
legend("bottomleft", legend = c("Bids", "Asks", "True Value", "Expected Value"), col = c("blue", "red", "green", "purple"), lty = 1, cex = 0.8)

# Initialize matrices to store averages for each position
average_MM_pnl <- matrix(NA, nrow = 100, ncol = 10)
average_NoisyInformed1_pnl <- matrix(NA, nrow = 100, ncol = 10)
average_NoisyInformed2_pnl <- matrix(NA, nrow = 100, ncol = 10)
average_NoisyInformed3_pnl <- matrix(NA, nrow = 100, ncol = 10)
average_NoisyInformed4_pnl <- matrix(NA, nrow = 100, ncol = 10)
average_NoisyInformed5_pnl <- matrix(NA, nrow = 100, ncol = 10)
average_NoisyInformed6_pnl <- matrix(NA, nrow = 100, ncol = 10)

# Loop through each simulation (n)
for (n in 1:10) {

  MM_pnl_set13 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_13[n, 6])), ", ")

  NoisyInformed1_pnl_set13 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_13[n, 8])), ", ")
  
  NoisyInformed2_pnl_set13 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_13[n, 10])), ", ")
  
  NoisyInformed3_pnl_set13 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_13[n, 12])), ", ")
  
  NoisyInformed4_pnl_set13 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_13[n, 14])), ", ")
  
  NoisyInformed5_pnl_set13 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_13[n, 16])), ", ")
  
  NoisyInformed6_pnl_set13 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_13[n, 18])), ", ")
  
  # Loop through each position (i)
  for (i in 1:100) {
    # Extract True and Expected values for the i-th position
    MM_pnl <- sapply(MM_pnl_set13, function(x) as.numeric(x[i]))
    NoisyInformed1_pnl <- sapply(NoisyInformed1_pnl_set13, function(x) as.numeric(x[i]))
    NoisyInformed2_pnl <- sapply(NoisyInformed2_pnl_set13, function(x) as.numeric(x[i]))
    NoisyInformed3_pnl <- sapply(NoisyInformed3_pnl_set13, function(x) as.numeric(x[i]))
    NoisyInformed4_pnl <- sapply(NoisyInformed4_pnl_set13, function(x) as.numeric(x[i]))
    NoisyInformed5_pnl <- sapply(NoisyInformed5_pnl_set13, function(x) as.numeric(x[i]))
    NoisyInformed6_pnl <- sapply(NoisyInformed6_pnl_set13, function(x) as.numeric(x[i]))
    
    # Calculate the average of True and Expected values for the i-th position
    average_MM_pnl[i, n] <- mean(MM_pnl, na.rm = TRUE)
    average_NoisyInformed1_pnl[i, n] <- mean(NoisyInformed1_pnl, na.rm = TRUE)
    average_NoisyInformed2_pnl[i, n] <- mean(NoisyInformed2_pnl, na.rm = TRUE)
    average_NoisyInformed3_pnl[i, n] <- mean(NoisyInformed3_pnl, na.rm = TRUE)
    average_NoisyInformed4_pnl[i, n] <- mean(NoisyInformed4_pnl, na.rm = TRUE)
    average_NoisyInformed5_pnl[i, n] <- mean(NoisyInformed5_pnl, na.rm = TRUE)
    average_NoisyInformed6_pnl[i, n] <- mean(NoisyInformed6_pnl, na.rm = TRUE)
  }
}

# Calculate the overall average for each position across all simulations
overall_average_MM_pnl <- rowMeans(average_MM_pnl, na.rm = TRUE)
overall_average_NoisyInformed1_pnl <- rowMeans(average_NoisyInformed1_pnl, na.rm = TRUE)
overall_average_NoisyInformed2_pnl <- rowMeans(average_NoisyInformed2_pnl, na.rm = TRUE)
overall_average_NoisyInformed3_pnl <- rowMeans(average_NoisyInformed3_pnl, na.rm = TRUE)
overall_average_NoisyInformed4_pnl <- rowMeans(average_NoisyInformed4_pnl, na.rm = TRUE)
overall_average_NoisyInformed5_pnl <- rowMeans(average_NoisyInformed5_pnl, na.rm = TRUE)
overall_average_NoisyInformed6_pnl <- rowMeans(average_NoisyInformed6_pnl, na.rm = TRUE)

# Plot the overall averages
plot(overall_average_MM_pnl, type = "l", pch = 16, col = "black", main = "Overall Average PNL", xlab = "Position in List", ylab = "Value", ylim = c(min(c(overall_average_MM_pnl, overall_average_NoisyInformed1_pnl, overall_average_NoisyInformed2_pnl, overall_average_NoisyInformed3_pnl, overall_average_NoisyInformed4_pnl, overall_average_NoisyInformed5_pnl, overall_average_NoisyInformed6_pnl)), max(c(overall_average_MM_pnl, overall_average_NoisyInformed1_pnl, overall_average_NoisyInformed2_pnl, overall_average_NoisyInformed3_pnl, overall_average_NoisyInformed4_pnl, overall_average_NoisyInformed5_pnl, overall_average_NoisyInformed6_pnl))))
lines(overall_average_NoisyInformed1_pnl, type = "l", pch = 16, col = "red")
lines(overall_average_NoisyInformed2_pnl, type = "l", pch = 16, col = "green")
lines(overall_average_NoisyInformed3_pnl, type = "l", pch = 16, col = "yellow")
lines(overall_average_NoisyInformed4_pnl, type = "l", pch = 16, col = "blue")
lines(overall_average_NoisyInformed5_pnl, type = "l", pch = 16, col = "purple")
lines(overall_average_NoisyInformed6_pnl, type = "l", pch = 16, col = "orange")

# Add legend
legend("bottomleft", legend = c("Market Maker", "Noisy Informed 1", "Noisy Informed 2", "Noisy Informed 3", "Noisy Informed 4", "Noisy Informed 5", "Noisy Informed 6"), col = c("black", "red", "green", "yellow", "blue", "purple", "orange"), lty = 1, cex = 0.8)

# Initialize matrices to store averages for each position
average_MM_pos <- matrix(NA, nrow = 100, ncol = 10)
average_NoisyInformed1_pos <- matrix(NA, nrow = 100, ncol = 10)
average_NoisyInformed2_pos <- matrix(NA, nrow = 100, ncol = 10)
average_NoisyInformed3_pos <- matrix(NA, nrow = 100, ncol = 10)
average_NoisyInformed4_pos <- matrix(NA, nrow = 100, ncol = 10)
average_NoisyInformed5_pos <- matrix(NA, nrow = 100, ncol = 10)
average_NoisyInformed6_pos <- matrix(NA, nrow = 100, ncol = 10)

# Loop through each simulation (n)
for (n in 1:10) {

  MM_pos_set13 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_13[n, 7])), ", ")

  NoisyInformed1_pos_set13 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_13[n, 9])), ", ")
  
  NoisyInformed2_pos_set13 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_13[n, 11])), ", ")
  
  NoisyInformed3_pos_set13 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_13[n, 13])), ", ")
  
  NoisyInformed4_pos_set13 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_13[n, 15])), ", ")
  
  NoisyInformed5_pos_set13 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_13[n, 17])), ", ")
  
  NoisyInformed6_pos_set13 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_13[n, 19])), ", ")
  
  # Loop through each position (i)
  for (i in 1:100) {
    # Extract True and Expected values for the i-th position
    MM_pos <- sapply(MM_pos_set13, function(x) as.numeric(x[i]))
    NoisyInformed1_pos <- sapply(NoisyInformed1_pos_set13, function(x) as.numeric(x[i]))
    NoisyInformed2_pos <- sapply(NoisyInformed2_pos_set13, function(x) as.numeric(x[i]))
    NoisyInformed3_pos <- sapply(NoisyInformed3_pos_set13, function(x) as.numeric(x[i]))
    NoisyInformed4_pos <- sapply(NoisyInformed4_pos_set13, function(x) as.numeric(x[i]))
    NoisyInformed5_pos <- sapply(NoisyInformed5_pos_set13, function(x) as.numeric(x[i]))
    NoisyInformed6_pos <- sapply(NoisyInformed6_pos_set13, function(x) as.numeric(x[i]))
    
    # Calculate the average of True and Expected values for the i-th position
    average_MM_pos[i, n] <- mean(MM_pos, na.rm = TRUE)
    average_NoisyInformed1_pos[i, n] <- mean(NoisyInformed1_pos, na.rm = TRUE)
    average_NoisyInformed2_pos[i, n] <- mean(NoisyInformed2_pos, na.rm = TRUE)
    average_NoisyInformed3_pos[i, n] <- mean(NoisyInformed3_pos, na.rm = TRUE)
    average_NoisyInformed4_pos[i, n] <- mean(NoisyInformed4_pos, na.rm = TRUE)
    average_NoisyInformed5_pos[i, n] <- mean(NoisyInformed5_pos, na.rm = TRUE)
    average_NoisyInformed6_pos[i, n] <- mean(NoisyInformed6_pos, na.rm = TRUE)
  }
}

# Calculate the overall average for each position across all simulations
overall_average_MM_pos <- rowMeans(average_MM_pos, na.rm = TRUE)
overall_average_NoisyInformed1_pos <- rowMeans(average_NoisyInformed1_pos, na.rm = TRUE)
overall_average_NoisyInformed2_pos <- rowMeans(average_NoisyInformed2_pos, na.rm = TRUE)
overall_average_NoisyInformed3_pos <- rowMeans(average_NoisyInformed3_pos, na.rm = TRUE)
overall_average_NoisyInformed4_pos <- rowMeans(average_NoisyInformed4_pos, na.rm = TRUE)
overall_average_NoisyInformed5_pos <- rowMeans(average_NoisyInformed5_pos, na.rm = TRUE)
overall_average_NoisyInformed6_pos <- rowMeans(average_NoisyInformed6_pos, na.rm = TRUE)

# Plot the overall averages
plot(overall_average_MM_pos, type = "l", pch = 16, col = "black", main = "Overall Average Position", xlab = "Position in List", ylab = "Value", ylim = c(min(c(overall_average_MM_pos, overall_average_StochNoisy1_pos, overall_average_NoisyInformed2_pos, overall_average_NoisyInformed3_pos, overall_average_NoisyInformed4_pos, overall_average_NoisyInformed5_pos, overall_average_NoisyInformed6_pos)), max(c(overall_average_MM_pos, overall_average_NoisyInformed1_pos, overall_average_NoisyInformed2_pos, overall_average_NoisyInformed3_pos, overall_average_NoisyInformed4_pos, overall_average_NoisyInformed5_pos, overall_average_NoisyInformed6_pos))))
lines(overall_average_NoisyInformed1_pos, type = "l", pch = 16, col = "red")
lines(overall_average_NoisyInformed2_pos, type = "l", pch = 16, col = "green")
lines(overall_average_NoisyInformed3_pos, type = "l", pch = 16, col = "yellow")
lines(overall_average_NoisyInformed4_pos, type = "l", pch = 16, col = "blue")
lines(overall_average_NoisyInformed5_pos, type = "l", pch = 16, col = "purple")
lines(overall_average_NoisyInformed6_pos, type = "l", pch = 16, col = "orange")

# Add legend
legend("topleft", legend = c("Market Maker", "Noisy Informed 1", "Noisy Informed 2", "Noisy Informed 3", "Noisy Informed 4", "Noisy Informed 5", "Noisy Informed 6"), col = c("black", "red", "green", "yellow", "blue", "purple", "orange"), lty = 1, cex = 0.8)

set14 (1 informed + 2 noisy informed + 2 noisy + 1 mean reversion)

# Initialize matrices to store averages for each position
average_bid <- matrix(NA, nrow = 100, ncol = 10)
average_ask <- matrix(NA, nrow = 100, ncol = 10)

# Loop through each simulation (n)
for (n in 1:10) {
  # Extract True values from the aggregated_results_4 dataframe
  Bids_set14 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_14[n, 4])), ", ")
  
  # Extract Expected values from the aggregated_results_4 dataframe
  Asks_set14 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_14[n, 5])), ", ")
  
  # Loop through each position (i)
  for (i in 1:100) {
    # Extract True and Expected values for the i-th position
    Bids <- sapply(Bids_set14, function(x) as.numeric(x[i]))
    Asks <- sapply(Asks_set14, function(x) as.numeric(x[i]))
    
    # Calculate the average of True and Expected values for the i-th position
    average_bid[i, n] <- mean(Bids, na.rm = TRUE)
    average_ask[i, n] <- mean(Asks, na.rm = TRUE)
  }
}

# Calculate the overall average for each position across all simulations
overall_average_bid <- rowMeans(average_bid, na.rm = TRUE)
overall_average_ask <- rowMeans(average_ask, na.rm = TRUE)

## True Value
# Initialize matrices to store averages for each position
average_true <- matrix(NA, nrow = 100, ncol = 10)
average_expected <- matrix(NA, nrow = 100, ncol = 10)

# Loop through each simulation (n)
for (n in 1:10) {
  # Extract True values from the aggregated_results_4 dataframe
  TrueValues_set14 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_14[n, 2])), ", ")
  
  # Extract Expected values from the aggregated_results_4 dataframe
  ExpectedValues_set14 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_14[n, 3])), ", ")
  
  # Loop through each position (i)
  for (i in 1:100) {
    # Extract True and Expected values for the i-th position
    True_values <- sapply(TrueValues_set14, function(x) as.numeric(x[i]))
    Expected_values <- sapply(ExpectedValues_set14, function(x) as.numeric(x[i]))
    
    # Calculate the average of True and Expected values for the i-th position
    average_true[i, n] <- mean(True_values, na.rm = TRUE)
    average_expected[i, n] <- mean(Expected_values, na.rm = TRUE)
  }
}

# Calculate the overall average for each position across all simulations
overall_average_true <- rowMeans(average_true, na.rm = TRUE)
overall_average_expected <- rowMeans(average_expected, na.rm = TRUE)

# Plot the overall averages
#plot(overall_average_true, type = "l", pch = 16, col = "blue", main = "Overall Average of True vs Expected Values", xlab = "Position in List", ylab = "Value", ylim = c(min(c(overall_average_true, overall_average_expected)), max(c(overall_average_true, overall_average_expected))))
#lines(overall_average_expected, type = "l", pch = 16, col = "red")
#legend("topright", legend = c("True Values", "Expected Values"), col = c("blue", "red"), lty = 1, cex = 0.8)

# Plot the overall averages
plot(overall_average_bid, type = "l", pch = 16, col = "blue", main = "Overall Average of Bids vs Asks & True vs Expected Values", xlab = "Position in List", ylab = "Value", ylim = c(min(c(overall_average_bid, overall_average_ask, overall_average_true, overall_average_expected)), max(c(overall_average_bid, overall_average_ask, overall_average_true, overall_average_expected))))
lines(overall_average_ask, type = "l", pch = 16, col = "red")
lines(overall_average_true, type = "l", pch = 16, col = "green")
lines(overall_average_expected, type = "l", pch = 16, col = "purple")
legend("bottomleft", legend = c("Bids", "Asks", "True Value", "Expected Value"), col = c("blue", "red", "green", "purple"), lty = 1, cex = 0.8)

# Initialize matrices to store averages for each position
average_MM_pnl <- matrix(NA, nrow = 100, ncol = 10)
average_Informed_pnl <- matrix(NA, nrow = 100, ncol = 10)
average_NoisyInformed1_pnl <- matrix(NA, nrow = 100, ncol = 10)
average_NoisyInformed2_pnl <- matrix(NA, nrow = 100, ncol = 10)
average_Noisy1_pnl <- matrix(NA, nrow = 100, ncol = 10)
average_Noisy2_pnl <- matrix(NA, nrow = 100, ncol = 10)
average_mr_pnl <- matrix(NA, nrow = 100, ncol = 10)

# Loop through each simulation (n)
for (n in 1:10) {

  MM_pnl_set14 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_14[n, 6])), ", ")

  Informed_pnl_set14 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_14[n, 8])), ", ")
  
  NoisyInformed1_pnl_set14 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_14[n, 10])), ", ")
  
  NoisyInformed2_pnl_set14 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_14[n, 12])), ", ")
  
  Noisy1_pnl_set14 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_14[n, 14])), ", ")
  
  Noisy2_pnl_set14 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_14[n, 16])), ", ")
  
  mr_pnl_set14 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_14[n, 18])), ", ")
  
  # Loop through each position (i)
  for (i in 1:100) {
    # Extract True and Expected values for the i-th position
    MM_pnl <- sapply(MM_pnl_set14, function(x) as.numeric(x[i]))
    Informed_pnl <- sapply(Informed_pnl_set14, function(x) as.numeric(x[i]))
    NoisyInformed1_pnl <- sapply(NoisyInformed1_pnl_set14, function(x) as.numeric(x[i]))
    NoisyInformed2_pnl <- sapply(NoisyInformed2_pnl_set14, function(x) as.numeric(x[i]))
    Noisy1_pnl <- sapply(Noisy1_pnl_set14, function(x) as.numeric(x[i]))
    Noisy2_pnl <- sapply(Noisy2_pnl_set14, function(x) as.numeric(x[i]))
    mr_pnl <- sapply(mr_pnl_set14, function(x) as.numeric(x[i]))
    
    # Calculate the average of True and Expected values for the i-th position
    average_MM_pnl[i, n] <- mean(MM_pnl, na.rm = TRUE)
    average_Informed_pnl[i, n] <- mean(Informed_pnl, na.rm = TRUE)
    average_NoisyInformed1_pnl[i, n] <- mean(NoisyInformed1_pnl, na.rm = TRUE)
    average_NoisyInformed2_pnl[i, n] <- mean(NoisyInformed2_pnl, na.rm = TRUE)
    average_Noisy1_pnl[i, n] <- mean(Noisy1_pnl, na.rm = TRUE)
    average_Noisy2_pnl[i, n] <- mean(Noisy2_pnl, na.rm = TRUE)
    average_mr_pnl[i, n] <- mean(mr_pnl, na.rm = TRUE)
  }
}

# Calculate the overall average for each position across all simulations
overall_average_MM_pnl <- rowMeans(average_MM_pnl, na.rm = TRUE)
overall_average_Informed_pnl <- rowMeans(average_Informed_pnl, na.rm = TRUE)
overall_average_NoisyInformed1_pnl <- rowMeans(average_NoisyInformed1_pnl, na.rm = TRUE)
overall_average_NoisyInformed2_pnl <- rowMeans(average_NoisyInformed2_pnl, na.rm = TRUE)
overall_average_Noisy1_pnl <- rowMeans(average_Noisy1_pnl, na.rm = TRUE)
overall_average_Noisy2_pnl <- rowMeans(average_Noisy2_pnl, na.rm = TRUE)
overall_average_mr_pnl <- rowMeans(average_mr_pnl, na.rm = TRUE)

# Plot the overall averages
plot(overall_average_MM_pnl, type = "l", pch = 16, col = "black", main = "Overall Average PNL", xlab = "Position in List", ylab = "Value", ylim = c(min(c(overall_average_MM_pnl, overall_average_Informed_pnl, overall_average_NoisyInformed1_pnl, overall_average_NoisyInformed2_pnl, overall_average_Noisy1_pnl, overall_average_Noisy2_pnl, overall_average_mr_pnl)), max(c(overall_average_MM_pnl, overall_average_Informed_pnl, overall_average_NoisyInformed1_pnl, overall_average_NoisyInformed2_pnl, overall_average_Noisy1_pnl, overall_average_Noisy2_pnl, overall_average_mr_pnl))))
lines(overall_average_Informed_pnl, type = "l", pch = 16, col = "red")
lines(overall_average_NoisyInformed1_pnl, type = "l", pch = 16, col = "green")
lines(overall_average_NoisyInformed2_pnl, type = "l", pch = 16, col = "yellow")
lines(overall_average_Noisy1_pnl, type = "l", pch = 16, col = "blue")
lines(overall_average_Noisy2_pnl, type = "l", pch = 16, col = "purple")
lines(overall_average_mr_pnl, type = "l", pch = 16, col = "orange")

# Add legend
legend("bottomleft", legend = c("Market Maker", "Informed", "Noisy Informed 1", "Noisy Informed 2", "Noisy 1", "Noisy 2", "Mean Reversion"), col = c("black", "red", "green", "yellow", "blue", "purple", "orange"), lty = 1, cex = 0.8)

# Initialize matrices to store averages for each position
average_MM_pos <- matrix(NA, nrow = 100, ncol = 10)
average_Informed_pos <- matrix(NA, nrow = 100, ncol = 10)
average_NoisyInformed1_pos <- matrix(NA, nrow = 100, ncol = 10)
average_NoisyInformed2_pos <- matrix(NA, nrow = 100, ncol = 10)
average_Noisy1_pos <- matrix(NA, nrow = 100, ncol = 10)
average_Noisy2_pos <- matrix(NA, nrow = 100, ncol = 10)
average_mr_pos <- matrix(NA, nrow = 100, ncol = 10)

# Loop through each simulation (n)
for (n in 1:10) {

  MM_pos_set14 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_14[n, 7])), ", ")

  Informed_pos_set14 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_14[n, 9])), ", ")
  
  NoisyInformed1_pos_set14 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_14[n, 11])), ", ")
  
  NoisyInformed2_pos_set14 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_14[n, 13])), ", ")
  
  Noisy1_pos_set14 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_14[n, 15])), ", ")
  
  Noisy2_pos_set14 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_14[n, 17])), ", ")
  
  mr_pos_set14 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_14[n, 19])), ", ")
  
  # Loop through each position (i)
  for (i in 1:100) {
    # Extract True and Expected values for the i-th position
    MM_pos <- sapply(MM_pos_set14, function(x) as.numeric(x[i]))
    Informed_pos <- sapply(Informed_pos_set14, function(x) as.numeric(x[i]))
    NoisyInformed1_pos <- sapply(NoisyInformed1_pos_set14, function(x) as.numeric(x[i]))
    NoisyInformed2_pos <- sapply(NoisyInformed2_pos_set14, function(x) as.numeric(x[i]))
    Noisy1_pos <- sapply(Noisy1_pos_set14, function(x) as.numeric(x[i]))
    Noisy2_pos <- sapply(Noisy2_pos_set14, function(x) as.numeric(x[i]))
    mr_pos <- sapply(mr_pos_set14, function(x) as.numeric(x[i]))
    
    # Calculate the average of True and Expected values for the i-th position
    average_MM_pos[i, n] <- mean(MM_pos, na.rm = TRUE)
    average_Informed_pos[i, n] <- mean(Informed_pos, na.rm = TRUE)
    average_NoisyInformed1_pos[i, n] <- mean(NoisyInformed1_pos, na.rm = TRUE)
    average_NoisyInformed2_pos[i, n] <- mean(NoisyInformed2_pos, na.rm = TRUE)
    average_Noisy1_pos[i, n] <- mean(Noisy1_pos, na.rm = TRUE)
    average_Noisy2_pos[i, n] <- mean(Noisy2_pos, na.rm = TRUE)
    average_mr_pos[i, n] <- mean(mr_pos, na.rm = TRUE)
  }
}

# Calculate the overall average for each position across all simulations
overall_average_MM_pos <- rowMeans(average_MM_pos, na.rm = TRUE)
overall_average_Informed_pos <- rowMeans(average_Informed_pos, na.rm = TRUE)
overall_average_NoisyInformed1_pos <- rowMeans(average_NoisyInformed1_pos, na.rm = TRUE)
overall_average_NoisyInformed2_pos <- rowMeans(average_NoisyInformed2_pos, na.rm = TRUE)
overall_average_Noisy1_pos <- rowMeans(average_Noisy1_pos, na.rm = TRUE)
overall_average_Noisy2_pos <- rowMeans(average_Noisy2_pos, na.rm = TRUE)
overall_average_mr_pos <- rowMeans(average_mr_pos, na.rm = TRUE)

# Plot the overall averages
plot(overall_average_MM_pos, type = "l", pch = 16, col = "black", main = "Overall Average Position", xlab = "Position in List", ylab = "Value", ylim = c(min(c(overall_average_MM_pos, overall_average_Informed_pos, overall_average_NoisyInformed1_pos, overall_average_NoisyInformed2_pos, overall_average_Noisy1_pos, overall_average_Noisy2_pos, overall_average_mr_pos)), max(c(overall_average_MM_pos, overall_average_Informed_pos, overall_average_NoisyInformed1_pos, overall_average_NoisyInformed2_pos, overall_average_Noisy1_pos, overall_average_Noisy2_pos, overall_average_mr_pos))))
lines(overall_average_Informed_pos, type = "l", pch = 16, col = "red")
lines(overall_average_NoisyInformed1_pos, type = "l", pch = 16, col = "green")
lines(overall_average_NoisyInformed2_pos, type = "l", pch = 16, col = "yellow")
lines(overall_average_Noisy1_pos, type = "l", pch = 16, col = "blue")
lines(overall_average_Noisy2_pos, type = "l", pch = 16, col = "purple")
lines(overall_average_mr_pos, type = "l", pch = 16, col = "orange")

# Add legend
legend("bottomleft", legend = c("Market Maker", "Informed", "Noisy Informed 1", "Noisy Informed 2", "Noisy 1", "Noisy 2", "Mean Reversion"), col = c("black", "red", "green", "yellow", "blue", "purple", "orange"), lty = 1, cex = 0.8)

set15 (1 informed + 2 noisy informed + 2 noisy + 1 monmentum)

# Initialize matrices to store averages for each position
average_bid <- matrix(NA, nrow = 100, ncol = 10)
average_ask <- matrix(NA, nrow = 100, ncol = 10)

# Loop through each simulation (n)
for (n in 1:10) {
  # Extract True values from the aggregated_results_4 dataframe
  Bids_set15 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_15[n, 4])), ", ")
  
  # Extract Expected values from the aggregated_results_4 dataframe
  Asks_set15 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_15[n, 5])), ", ")
  
  # Loop through each position (i)
  for (i in 1:100) {
    # Extract True and Expected values for the i-th position
    Bids <- sapply(Bids_set15, function(x) as.numeric(x[i]))
    Asks <- sapply(Asks_set15, function(x) as.numeric(x[i]))
    
    # Calculate the average of True and Expected values for the i-th position
    average_bid[i, n] <- mean(Bids, na.rm = TRUE)
    average_ask[i, n] <- mean(Asks, na.rm = TRUE)
  }
}

# Calculate the overall average for each position across all simulations
overall_average_bid <- rowMeans(average_bid, na.rm = TRUE)
overall_average_ask <- rowMeans(average_ask, na.rm = TRUE)

## True Value
# Initialize matrices to store averages for each position
average_true <- matrix(NA, nrow = 100, ncol = 10)
average_expected <- matrix(NA, nrow = 100, ncol = 10)

# Loop through each simulation (n)
for (n in 1:10) {
  # Extract True values from the aggregated_results_4 dataframe
  TrueValues_set15 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_15[n, 2])), ", ")
  
  # Extract Expected values from the aggregated_results_4 dataframe
  ExpectedValues_set15 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_15[n, 3])), ", ")
  
  # Loop through each position (i)
  for (i in 1:100) {
    # Extract True and Expected values for the i-th position
    True_values <- sapply(TrueValues_set15, function(x) as.numeric(x[i]))
    Expected_values <- sapply(ExpectedValues_set15, function(x) as.numeric(x[i]))
    
    # Calculate the average of True and Expected values for the i-th position
    average_true[i, n] <- mean(True_values, na.rm = TRUE)
    average_expected[i, n] <- mean(Expected_values, na.rm = TRUE)
  }
}

# Calculate the overall average for each position across all simulations
overall_average_true <- rowMeans(average_true, na.rm = TRUE)
overall_average_expected <- rowMeans(average_expected, na.rm = TRUE)

# Plot the overall averages
#plot(overall_average_true, type = "l", pch = 16, col = "blue", main = "Overall Average of True vs Expected Values", xlab = "Position in List", ylab = "Value", ylim = c(min(c(overall_average_true, overall_average_expected)), max(c(overall_average_true, overall_average_expected))))
#lines(overall_average_expected, type = "l", pch = 16, col = "red")
#legend("topright", legend = c("True Values", "Expected Values"), col = c("blue", "red"), lty = 1, cex = 0.8)

# Plot the overall averages
plot(overall_average_bid, type = "l", pch = 16, col = "blue", main = "Overall Average of Bids vs Asks & True vs Expected Values", xlab = "Position in List", ylab = "Value", ylim = c(min(c(overall_average_bid, overall_average_ask, overall_average_true, overall_average_expected)), max(c(overall_average_bid, overall_average_ask, overall_average_true, overall_average_expected))))
lines(overall_average_ask, type = "l", pch = 16, col = "red")
lines(overall_average_true, type = "l", pch = 16, col = "green")
lines(overall_average_expected, type = "l", pch = 16, col = "purple")
legend("bottomleft", legend = c("Bids", "Asks", "True Value", "Expected Value"), col = c("blue", "red", "green", "purple"), lty = 1, cex = 0.8)

# Initialize matrices to store averages for each position
average_MM_pnl <- matrix(NA, nrow = 100, ncol = 10)
average_Informed_pnl <- matrix(NA, nrow = 100, ncol = 10)
average_NoisyInformed1_pnl <- matrix(NA, nrow = 100, ncol = 10)
average_NoisyInformed2_pnl <- matrix(NA, nrow = 100, ncol = 10)
average_Noisy1_pnl <- matrix(NA, nrow = 100, ncol = 10)
average_Noisy2_pnl <- matrix(NA, nrow = 100, ncol = 10)
average_mom_pnl <- matrix(NA, nrow = 100, ncol = 10)

# Loop through each simulation (n)
for (n in 1:10) {

  MM_pnl_set15 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_15[n, 6])), ", ")

  Informed_pnl_set15 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_15[n, 8])), ", ")
  
  NoisyInformed1_pnl_set15 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_15[n, 10])), ", ")
  
  NoisyInformed2_pnl_set15 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_15[n, 12])), ", ")
  
  Noisy1_pnl_set15 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_15[n, 14])), ", ")
  
  Noisy2_pnl_set15 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_15[n, 16])), ", ")
  
  mom_pnl_set15 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_15[n, 18])), ", ")
  
  # Loop through each position (i)
  for (i in 1:100) {
    # Extract True and Expected values for the i-th position
    MM_pnl <- sapply(MM_pnl_set15, function(x) as.numeric(x[i]))
    Informed_pnl <- sapply(Informed_pnl_set15, function(x) as.numeric(x[i]))
    NoisyInformed1_pnl <- sapply(NoisyInformed1_pnl_set15, function(x) as.numeric(x[i]))
    NoisyInformed2_pnl <- sapply(NoisyInformed2_pnl_set15, function(x) as.numeric(x[i]))
    Noisy1_pnl <- sapply(Noisy1_pnl_set15, function(x) as.numeric(x[i]))
    Noisy2_pnl <- sapply(Noisy2_pnl_set15, function(x) as.numeric(x[i]))
    mom_pnl <- sapply(mom_pnl_set15, function(x) as.numeric(x[i]))
    
    # Calculate the average of True and Expected values for the i-th position
    average_MM_pnl[i, n] <- mean(MM_pnl, na.rm = TRUE)
    average_Informed_pnl[i, n] <- mean(Informed_pnl, na.rm = TRUE)
    average_NoisyInformed1_pnl[i, n] <- mean(NoisyInformed1_pnl, na.rm = TRUE)
    average_NoisyInformed2_pnl[i, n] <- mean(NoisyInformed2_pnl, na.rm = TRUE)
    average_Noisy1_pnl[i, n] <- mean(Noisy1_pnl, na.rm = TRUE)
    average_Noisy2_pnl[i, n] <- mean(Noisy2_pnl, na.rm = TRUE)
    average_mom_pnl[i, n] <- mean(mom_pnl, na.rm = TRUE)
  }
}

# Calculate the overall average for each position across all simulations
overall_average_MM_pnl <- rowMeans(average_MM_pnl, na.rm = TRUE)
overall_average_Informed_pnl <- rowMeans(average_Informed_pnl, na.rm = TRUE)
overall_average_NoisyInformed1_pnl <- rowMeans(average_NoisyInformed1_pnl, na.rm = TRUE)
overall_average_NoisyInformed2_pnl <- rowMeans(average_NoisyInformed2_pnl, na.rm = TRUE)
overall_average_Noisy1_pnl <- rowMeans(average_Noisy1_pnl, na.rm = TRUE)
overall_average_Noisy2_pnl <- rowMeans(average_Noisy2_pnl, na.rm = TRUE)
overall_average_mom_pnl <- rowMeans(average_mom_pnl, na.rm = TRUE)

# Plot the overall averages
plot(overall_average_MM_pnl, type = "l", pch = 16, col = "black", main = "Overall Average PNL", xlab = "Position in List", ylab = "Value", ylim = c(min(c(overall_average_MM_pnl, overall_average_Informed_pnl, overall_average_NoisyInformed1_pnl, overall_average_NoisyInformed2_pnl, overall_average_Noisy1_pnl, overall_average_Noisy2_pnl, overall_average_mom_pnl)), max(c(overall_average_MM_pnl, overall_average_Informed_pnl, overall_average_NoisyInformed1_pnl, overall_average_NoisyInformed2_pnl, overall_average_Noisy1_pnl, overall_average_Noisy2_pnl, overall_average_mom_pnl))))
lines(overall_average_Informed_pnl, type = "l", pch = 16, col = "red")
lines(overall_average_NoisyInformed1_pnl, type = "l", pch = 16, col = "green")
lines(overall_average_NoisyInformed2_pnl, type = "l", pch = 16, col = "yellow")
lines(overall_average_Noisy1_pnl, type = "l", pch = 16, col = "blue")
lines(overall_average_Noisy2_pnl, type = "l", pch = 16, col = "purple")
lines(overall_average_mom_pnl, type = "l", pch = 16, col = "orange")

# Add legend
legend("bottomleft", legend = c("Market Maker", "Informed", "Noisy Informed 1", "Noisy Informed 2", "Noisy 1", "Noisy 2", "Momentum"), col = c("black", "red", "green", "yellow", "blue", "purple", "orange"), lty = 1, cex = 0.8)

# Initialize matrices to store averages for each position
average_MM_pos <- matrix(NA, nrow = 100, ncol = 10)
average_Informed_pos <- matrix(NA, nrow = 100, ncol = 10)
average_NoisyInformed1_pos <- matrix(NA, nrow = 100, ncol = 10)
average_NoisyInformed2_pos <- matrix(NA, nrow = 100, ncol = 10)
average_Noisy1_pos <- matrix(NA, nrow = 100, ncol = 10)
average_Noisy2_pos <- matrix(NA, nrow = 100, ncol = 10)
average_mom_pos <- matrix(NA, nrow = 100, ncol = 10)

# Loop through each simulation (n)
for (n in 1:10) {

  MM_pos_set15 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_15[n, 7])), ", ")

  Informed_pos_set15 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_15[n, 9])), ", ")
  
  NoisyInformed1_pos_set15 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_15[n, 11])), ", ")
  
  NoisyInformed2_pos_set15 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_15[n, 13])), ", ")
  
  Noisy1_pos_set15 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_15[n, 15])), ", ")
  
  Noisy2_pos_set15 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_15[n, 17])), ", ")
  
  mom_pos_set15 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_15[n, 19])), ", ")
  
  # Loop through each position (i)
  for (i in 1:100) {
    # Extract True and Expected values for the i-th position
    MM_pos <- sapply(MM_pos_set15, function(x) as.numeric(x[i]))
    Informed_pos <- sapply(Informed_pos_set15, function(x) as.numeric(x[i]))
    NoisyInformed1_pos <- sapply(NoisyInformed1_pos_set15, function(x) as.numeric(x[i]))
    NoisyInformed2_pos <- sapply(NoisyInformed2_pos_set15, function(x) as.numeric(x[i]))
    Noisy1_pos <- sapply(Noisy1_pos_set15, function(x) as.numeric(x[i]))
    Noisy2_pos <- sapply(Noisy2_pos_set15, function(x) as.numeric(x[i]))
    mom_pos <- sapply(mom_pos_set15, function(x) as.numeric(x[i]))
    
    # Calculate the average of True and Expected values for the i-th position
    average_MM_pos[i, n] <- mean(MM_pos, na.rm = TRUE)
    average_Informed_pos[i, n] <- mean(Informed_pos, na.rm = TRUE)
    average_NoisyInformed1_pos[i, n] <- mean(NoisyInformed1_pos, na.rm = TRUE)
    average_NoisyInformed2_pos[i, n] <- mean(NoisyInformed2_pos, na.rm = TRUE)
    average_Noisy1_pos[i, n] <- mean(Noisy1_pos, na.rm = TRUE)
    average_Noisy2_pos[i, n] <- mean(Noisy2_pos, na.rm = TRUE)
    average_mom_pos[i, n] <- mean(mom_pos, na.rm = TRUE)
  }
}

# Calculate the overall average for each position across all simulations
overall_average_MM_pos <- rowMeans(average_MM_pos, na.rm = TRUE)
overall_average_Informed_pos <- rowMeans(average_Informed_pos, na.rm = TRUE)
overall_average_NoisyInformed1_pos <- rowMeans(average_NoisyInformed1_pos, na.rm = TRUE)
overall_average_NoisyInformed2_pos <- rowMeans(average_NoisyInformed2_pos, na.rm = TRUE)
overall_average_Noisy1_pos <- rowMeans(average_Noisy1_pos, na.rm = TRUE)
overall_average_Noisy2_pos <- rowMeans(average_Noisy2_pos, na.rm = TRUE)
overall_average_mom_pos <- rowMeans(average_mom_pos, na.rm = TRUE)

# Plot the overall averages
plot(overall_average_MM_pos, type = "l", pch = 16, col = "black", main = "Overall Average Position", xlab = "Position in List", ylab = "Value", ylim = c(min(c(overall_average_MM_pos, overall_average_Informed_pos, overall_average_NoisyInformed1_pos, overall_average_NoisyInformed2_pos, overall_average_Noisy1_pos, overall_average_Noisy2_pos, overall_average_mom_pos)), max(c(overall_average_MM_pos, overall_average_Informed_pos, overall_average_NoisyInformed1_pos, overall_average_NoisyInformed2_pos, overall_average_Noisy1_pos, overall_average_Noisy2_pos, overall_average_mom_pos))))
lines(overall_average_Informed_pos, type = "l", pch = 16, col = "red")
lines(overall_average_NoisyInformed1_pos, type = "l", pch = 16, col = "green")
lines(overall_average_NoisyInformed2_pos, type = "l", pch = 16, col = "yellow")
lines(overall_average_Noisy1_pos, type = "l", pch = 16, col = "blue")
lines(overall_average_Noisy2_pos, type = "l", pch = 16, col = "purple")
lines(overall_average_mom_pos, type = "l", pch = 16, col = "orange")

# Add legend
legend("bottomleft", legend = c("Market Maker", "Informed", "Noisy Informed 1", "Noisy Informed 2", "Noisy 1", "Noisy 2", "Momentum"), col = c("black", "red", "green", "yellow", "blue", "purple", "orange"), lty = 1, cex = 0.8)

LS0tCnRpdGxlOiAiRGF0YSBBbmFseXNpcyBhbmQgR2FtZSBUaGVvcnkiCm91dHB1dDogaHRtbF9ub3RlYm9vawotLS0KCmBgYHtyfQpsaWJyYXJ5KGdncGxvdDIpCmxpYnJhcnkoZHBseXIpCmxpYnJhcnkoc3RhdHMpCmBgYAoKIyMjIFRydWUgdmFsdWUgaW4gc2V0MSwgc2ltMQoKYGBge3J9ClRydWVWYWx1ZV9zZXQxIDwtIHN0cnNwbGl0KGdzdWIoIlxcW3xcXF0iLCAiIiwgdW5saXN0KGFnZ3JlZ2F0ZWRfcmVzdWx0c18xWzEsIDJdKSksICIsICIpW1sxXV0KI2F2ZXJhZ2UgPC0gbWVhbihUcnVlVmFsdWVzX3NldDEpCnBsb3QoVHJ1ZVZhbHVlX3NldDEsIHR5cGUgPSAibCIsIHBjaCA9IDE2LCBjb2wgPSAiYmx1ZSIsIG1haW4gPSAiVHJ1ZSBWYWx1ZXMgaW4gc2ltMCIsIHhsYWIgPSAiSXRlcmF0aW9uIiwgeWxhYiA9ICJWYWx1ZSIpCgojVHJ1ZVZhbHVlX3NldDFfc2ltMCA8LSBzdHJzcGxpdChnc3ViKCJcXFt8XFxdIiwgIiIsIHVubGlzdChhZ2dyZWdhdGVkX3Jlc3VsdHNfMVsxLCAyXSkpLCAiLCAiKVtbMV1dCiN1bmxpc3QoYWdncmVnYXRlZF9yZXN1bHRzXzFbMSwgMl0pCiNjbGVhbl9zdHIgPSBnc3ViKCJcXFt8XFxdIiwgIiIsIFRydWVWYWx1ZV9zaW0wKQojVHJ1ZVZhbHVlX3NldDFfc2ltMSA8LSBzdHJzcGxpdChnc3ViKCJcXFt8XFxdIiwgIiIsIHVubGlzdChhZ2dyZWdhdGVkX3Jlc3VsdHNfMVsyLCAyXSkpLCAiLCAiKVtbMV1dCgojcHJpbnQoVmFsdWVzKQojWCA8LSAxOjEwMAojcGxvdChUcnVlVmFsdWVfc2V0MV9zaW0wLCB0eXBlID0gImwiLCBwY2ggPSAxNiwgY29sID0gImJsdWUiLCBtYWluID0gIlRydWUgVmFsdWVzIGluIHNpbTAiLCB4bGFiID0gIkl0ZXJhdGlvbiIsIHlsYWIgPSAiVmFsdWUiKQojcGxvdChUcnVlVmFsdWVfc2V0MV9zaW0xLCB0eXBlID0gImwiLCBwY2ggPSAxNiwgY29sID0gImJsdWUiLCBtYWluID0gIlRydWUgVmFsdWVzIGluIHNpbTEiLCB4bGFiID0gIkl0ZXJhdGlvbiIsIHlsYWIgPSAiVmFsdWUiKQoKI2ZpdCA8LSBsbShWYWx1ZXMgfiBYKQojYWJsaW5lKGZpdCwgY29sID0gInJlZCIpCmBgYAojIyMgVHJ1ZSB2YWx1ZXMgaW4gc2V0IDEsIGFsbCBzaW0KCmBgYHtyfQojIEluaXRpYWxpemUgYW4gZW1wdHkgdmVjdG9yIHRvIHN0b3JlIHRoZSBUcnVlIHZhbHVlcwpUcnVlVmFsdWVzX3NldDEgPC0gbnVtZXJpYygpCgojIExvb3AgdGhyb3VnaCBlYWNoIGl0ZXJhdGlvbiAobikKZm9yIChuIGluIDE6MTApIHsKICAjIEV4dHJhY3QgVHJ1ZSB2YWx1ZXMgZnJvbSB0aGUgYWdncmVnYXRlZF9yZXN1bHRzXzEgZGF0YWZyYW1lCiAgVHJ1ZVZhbHVlX3NldDEgPC0gc3Ryc3BsaXQoZ3N1YigiXFxbfFxcXSIsICIiLCB1bmxpc3QoYWdncmVnYXRlZF9yZXN1bHRzXzFbbiwgMl0pKSwgIiwgIilbWzFdXQogIAogICMgQXBwZW5kIHRoZSBUcnVlIHZhbHVlcyB0byB0aGUgdmVjdG9yCiAgVHJ1ZVZhbHVlc19zZXQxIDwtIGMoVHJ1ZVZhbHVlc19zZXQxLCBhcy5udW1lcmljKFRydWVWYWx1ZV9zZXQxKSkKfQoKIyBDYWxjdWxhdGUgdGhlIGF2ZXJhZ2Ugb2YgVHJ1ZSB2YWx1ZXMKYXZlcmFnZSA8LSBtZWFuKFRydWVWYWx1ZXNfc2V0MSkKCiMgUGxvdCB0aGUgYXZlcmFnZQpwbG90KFRydWVWYWx1ZXNfc2V0MSwgdHlwZSA9ICJsIiwgcGNoID0gMTYsIGNvbCA9ICJibHVlIiwgbWFpbiA9ICJUcnVlIFZhbHVlcyBpbiBzZXQgMSIsIHhsYWIgPSAiSXRlcmF0aW9uIiwgeWxhYiA9ICJWYWx1ZSIpCgojIEFkZCBhIGhvcml6b250YWwgbGluZSBmb3IgdGhlIGF2ZXJhZ2UKYWJsaW5lKGggPSBhdmVyYWdlLCBjb2wgPSAicmVkIiwgbHdkID0gMikKCmBgYAoKIyMjIEV4cGVjdGVkIHZhbHVlIGluIHNldDEsIGFsbCBzaW0KCmBgYHtyfQojIEluaXRpYWxpemUgYW4gZW1wdHkgdmVjdG9yIHRvIHN0b3JlIHRoZSBUcnVlIHZhbHVlcwpFeHBlY3RlZFZhbHVlc19zZXQxIDwtIG51bWVyaWMoKQoKIyBMb29wIHRocm91Z2ggZWFjaCBpdGVyYXRpb24gKG4pCmZvciAobiBpbiAxOjEwKSB7CiAgIyBFeHRyYWN0IFRydWUgdmFsdWVzIGZyb20gdGhlIGFnZ3JlZ2F0ZWRfcmVzdWx0c18xIGRhdGFmcmFtZQogIEV4cGVjdGVkVmFsdWVfc2V0MSA8LSBzdHJzcGxpdChnc3ViKCJcXFt8XFxdIiwgIiIsIHVubGlzdChhZ2dyZWdhdGVkX3Jlc3VsdHNfMVtuLCAzXSkpLCAiLCAiKVtbMV1dCiAgCiAgIyBBcHBlbmQgdGhlIFRydWUgdmFsdWVzIHRvIHRoZSB2ZWN0b3IKICBFeHBlY3RlZFZhbHVlc19zZXQxIDwtIGMoRXhwZWN0ZWRWYWx1ZXNfc2V0MSwgYXMubnVtZXJpYyhFeHBlY3RlZFZhbHVlX3NldDEpKQp9CgojIENhbGN1bGF0ZSB0aGUgYXZlcmFnZSBvZiBUcnVlIHZhbHVlcwphdmVyYWdlIDwtIG1lYW4oRXhwZWN0ZWRWYWx1ZXNfc2V0MSkKCiMgUGxvdCB0aGUgYXZlcmFnZQpwbG90KEV4cGVjdGVkVmFsdWVzX3NldDEsIHR5cGUgPSAibCIsIHBjaCA9IDE2LCBjb2wgPSAiYmx1ZSIsIG1haW4gPSAiRXhwZWN0ZWQgVmFsdWVzIGluIHNldCAxIiwgeGxhYiA9ICJJdGVyYXRpb24iLCB5bGFiID0gIlZhbHVlIikKCiMgQWRkIGEgaG9yaXpvbnRhbCBsaW5lIGZvciB0aGUgYXZlcmFnZQphYmxpbmUoaCA9IGF2ZXJhZ2UsIGNvbCA9ICJyZWQiLCBsd2QgPSAyKQoKYGBgCgojIyMgVHJ1ZSBhbmQgRXhwZWN0ZWQgVmFsdWVzIGluIHNldCAxCgpgYGB7cn0KIyBJbml0aWFsaXplIGVtcHR5IHZlY3RvcnMgdG8gc3RvcmUgdHJ1ZSBhbmQgZXhwZWN0ZWQgdmFsdWVzClRydWVWYWx1ZXNfc2V0MSA8LSBudW1lcmljKCkKRXhwZWN0ZWRWYWx1ZXNfc2V0MSA8LSBudW1lcmljKCkKCiMgTG9vcCB0aHJvdWdoIGVhY2ggaXRlcmF0aW9uIChuKQpmb3IgKG4gaW4gMToxMCkgewogICMgRXh0cmFjdCBUcnVlIHZhbHVlcyBmcm9tIHRoZSBhZ2dyZWdhdGVkX3Jlc3VsdHNfMSBkYXRhZnJhbWUKICBUcnVlVmFsdWVfc2V0MSA8LSBzdHJzcGxpdChnc3ViKCJcXFt8XFxdIiwgIiIsIHVubGlzdChhZ2dyZWdhdGVkX3Jlc3VsdHNfMVtuLCAyXSkpLCAiLCAiKVtbMV1dCiAgCiAgIyBFeHRyYWN0IEV4cGVjdGVkIHZhbHVlcyBmcm9tIHRoZSBhZ2dyZWdhdGVkX3Jlc3VsdHNfMSBkYXRhZnJhbWUKICBFeHBlY3RlZFZhbHVlX3NldDEgPC0gc3Ryc3BsaXQoZ3N1YigiXFxbfFxcXSIsICIiLCB1bmxpc3QoYWdncmVnYXRlZF9yZXN1bHRzXzFbbiwgM10pKSwgIiwgIilbWzFdXQogIAogICMgQXBwZW5kIHRoZSBUcnVlIGFuZCBFeHBlY3RlZCB2YWx1ZXMgdG8gdGhlaXIgcmVzcGVjdGl2ZSB2ZWN0b3JzCiAgVHJ1ZVZhbHVlc19zZXQxIDwtIGMoVHJ1ZVZhbHVlc19zZXQxLCBhcy5udW1lcmljKFRydWVWYWx1ZV9zZXQxKSkKICBFeHBlY3RlZFZhbHVlc19zZXQxIDwtIGMoRXhwZWN0ZWRWYWx1ZXNfc2V0MSwgYXMubnVtZXJpYyhFeHBlY3RlZFZhbHVlX3NldDEpKQp9CgojIENhbGN1bGF0ZSB0aGUgYXZlcmFnZSBvZiBUcnVlIHZhbHVlcwphdmVyYWdlX3RydWUgPC0gbWVhbihUcnVlVmFsdWVzX3NldDEpCgojIENhbGN1bGF0ZSB0aGUgYXZlcmFnZSBvZiBFeHBlY3RlZCB2YWx1ZXMKYXZlcmFnZV9leHBlY3RlZCA8LSBtZWFuKEV4cGVjdGVkVmFsdWVzX3NldDEpCgojIFBsb3QgVHJ1ZSBhbmQgRXhwZWN0ZWQgdmFsdWVzIG9uIHRoZSBzYW1lIHBsb3QKcGxvdChUcnVlVmFsdWVzX3NldDEsIHR5cGUgPSAibCIsIHBjaCA9IDE2LCBjb2wgPSAiYmx1ZSIsIG1haW4gPSAiVHJ1ZSB2cyBFeHBlY3RlZCBWYWx1ZXMgaW4gc2V0IDEiLCB4bGFiID0gIkl0ZXJhdGlvbiIsIHlsYWIgPSAiVmFsdWUiKQpsaW5lcyhFeHBlY3RlZFZhbHVlc19zZXQxLCB0eXBlID0gImwiLCBwY2ggPSAxNiwgY29sID0gInJlZCIpCgojIEFkZCBsZWdlbmQKbGVnZW5kKCJ0b3ByaWdodCIsIGxlZ2VuZCA9IGMoIlRydWUgVmFsdWVzIiwgIkV4cGVjdGVkIFZhbHVlcyIpLCBjb2wgPSBjKCJibHVlIiwgInJlZCIpLCBsdHkgPSAxLCBjZXggPSAwLjgpCgojIEFkZCBob3Jpem9udGFsIGxpbmVzIGZvciB0aGUgYXZlcmFnZXMKYWJsaW5lKGggPSBhdmVyYWdlX3RydWUsIGNvbCA9ICJibHVlIiwgbHdkID0gMSkKYWJsaW5lKGggPSBhdmVyYWdlX2V4cGVjdGVkLCBjb2wgPSAicmVkIiwgbHdkID0gMSkKYGBgCgojIyMgQmlkcyBpbiBzZXQxLCBzaW0xCgoKYGBge3J9CkJpZHNfc2V0MSA8LSBzdHJzcGxpdChnc3ViKCJcXFt8XFxdIiwgIiIsIHVubGlzdChhZ2dyZWdhdGVkX3Jlc3VsdHNfMVsxLCA0XSkpLCAiLCAiKVtbMV1dCiNhdmVyYWdlIDwtIG1lYW4oVHJ1ZVZhbHVlc19zZXQxKQpwbG90KEJpZHNfc2V0MSwgdHlwZSA9ICJsIiwgcGNoID0gMTYsIGNvbCA9ICJibHVlIiwgbWFpbiA9ICJUcnVlIFZhbHVlcyBpbiBzaW0wIiwgeGxhYiA9ICJJdGVyYXRpb24iLCB5bGFiID0gIlZhbHVlIikKYGBgCgojIyMgQmlkcyBpbiBzZXQgMSwgYWxsIHNpbQoKYGBge3J9CiMgSW5pdGlhbGl6ZSBhbiBlbXB0eSB2ZWN0b3IgdG8gc3RvcmUgdGhlIFRydWUgdmFsdWVzCkJpZHNfc2V0MSA8LSBudW1lcmljKCkKCiMgTG9vcCB0aHJvdWdoIGVhY2ggaXRlcmF0aW9uIChuKQpmb3IgKG4gaW4gMToxMCkgewogICMgRXh0cmFjdCBUcnVlIHZhbHVlcyBmcm9tIHRoZSBhZ2dyZWdhdGVkX3Jlc3VsdHNfMSBkYXRhZnJhbWUKICBCaWRfc2V0MSA8LSBzdHJzcGxpdChnc3ViKCJcXFt8XFxdIiwgIiIsIHVubGlzdChhZ2dyZWdhdGVkX3Jlc3VsdHNfMVtuLCA0XSkpLCAiLCAiKVtbMV1dCiAgCiAgIyBBcHBlbmQgdGhlIFRydWUgdmFsdWVzIHRvIHRoZSB2ZWN0b3IgKGNvcnJlY3RlZCB0eXBvKQogIEJpZHNfc2V0MSA8LSBjKEJpZHNfc2V0MSwgYXMubnVtZXJpYyhCaWRfc2V0MSkpCn0KCiMgQ2hlY2sgaWYgdGhlIHZlY3RvciBpcyBwcm9wZXJseSBwb3B1bGF0ZWQKI3ByaW50KEJpZHNfc2V0MSkKCiMgQ2FsY3VsYXRlIHRoZSBhdmVyYWdlIG9mIFRydWUgdmFsdWVzCmF2ZXJhZ2UgPC0gbWVhbihCaWRzX3NldDEsIG5hLnJtID0gVFJVRSkKCiMgUGxvdCB0aGUgdmFsdWVzCnBsb3QoQmlkc19zZXQxLCB0eXBlID0gImwiLCBwY2ggPSAxNiwgY29sID0gImJsdWUiLCBtYWluID0gIkJpZCB2cyBBc2sgaW4gc2V0IDEiLCB4bGFiID0gIkl0ZXJhdGlvbiIsIHlsYWIgPSAiVmFsdWUiKQoKIyBBZGQgYSBob3Jpem9udGFsIGxpbmUgZm9yIHRoZSBhdmVyYWdlCmFibGluZShoID0gYXZlcmFnZSwgY29sID0gInJlZCIsIGx3ZCA9IDIpCgpgYGAKCiMjIyBCaWRzIGFuZCBBc2tzIE92ZXJhbGwKCmBgYHtyfQojIEluaXRpYWxpemUgZW1wdHkgdmVjdG9ycyB0byBzdG9yZSB0aGUgQmlkIGFuZCBBc2sgdmFsdWVzCkJpZHNfc2V0MSA8LSBudW1lcmljKCkKQXNrc19zZXQxIDwtIG51bWVyaWMoKQoKIyBMb29wIHRocm91Z2ggZWFjaCBpdGVyYXRpb24gKG4pCmZvciAobiBpbiAxOjEwKSB7CiAgIyBFeHRyYWN0IEJpZCB2YWx1ZXMgZnJvbSB0aGUgYWdncmVnYXRlZF9yZXN1bHRzXzEgZGF0YWZyYW1lCiAgQmlkX3NldDEgPC0gc3Ryc3BsaXQoZ3N1YigiXFxbfFxcXSIsICIiLCB1bmxpc3QoYWdncmVnYXRlZF9yZXN1bHRzXzFbbiwgNF0pKSwgIiwgIilbWzFdXQogIAogICMgRXh0cmFjdCBBc2sgdmFsdWVzIGZyb20gdGhlIGFnZ3JlZ2F0ZWRfcmVzdWx0c18xIGRhdGFmcmFtZSAobmV4dCBjb2x1bW4pCiAgQXNrX3NldDEgPC0gc3Ryc3BsaXQoZ3N1YigiXFxbfFxcXSIsICIiLCB1bmxpc3QoYWdncmVnYXRlZF9yZXN1bHRzXzFbbiwgNV0pKSwgIiwgIilbWzFdXQogIAogICMgQXBwZW5kIHRoZSBCaWQgYW5kIEFzayB2YWx1ZXMgdG8gdGhlaXIgcmVzcGVjdGl2ZSB2ZWN0b3JzCiAgQmlkc19zZXQxIDwtIGMoQmlkc19zZXQxLCBhcy5udW1lcmljKEJpZF9zZXQxKSkKICBBc2tzX3NldDEgPC0gYyhBc2tzX3NldDEsIGFzLm51bWVyaWMoQXNrX3NldDEpKQp9CgojIENhbGN1bGF0ZSB0aGUgYXZlcmFnZSBvZiBCaWQgYW5kIEFzayB2YWx1ZXMKYXZlcmFnZV9iaWRzIDwtIG1lYW4oQmlkc19zZXQxLCBuYS5ybSA9IFRSVUUpCmF2ZXJhZ2VfYXNrcyA8LSBtZWFuKEFza3Nfc2V0MSwgbmEucm0gPSBUUlVFKQoKIyBQbG90IHRoZSBCaWQgYW5kIEFzayB2YWx1ZXMgb24gdGhlIHNhbWUgcGxvdApwbG90KEJpZHNfc2V0MSwgdHlwZSA9ICJsIiwgcGNoID0gMTYsIGNvbCA9ICJibHVlIiwgbWFpbiA9ICJCaWRzIHZzIEFza3MgaW4gc2V0IDEiLCB4bGFiID0gIkl0ZXJhdGlvbiIsIHlsYWIgPSAiVmFsdWUiKQpsaW5lcyhBc2tzX3NldDEsIHR5cGUgPSAibCIsIHBjaCA9IDE2LCBjb2wgPSAicmVkIikKCiMgQWRkIGxlZ2VuZApsZWdlbmQoInRvcHJpZ2h0IiwgbGVnZW5kID0gYygiQmlkcyIsICJBc2tzIiksIGNvbCA9IGMoImJsdWUiLCAicmVkIiksIGx0eSA9IDEsIGNleCA9IDAuOCkKCiMgQWRkIGhvcml6b250YWwgbGluZXMgZm9yIHRoZSBhdmVyYWdlcwphYmxpbmUoaCA9IGF2ZXJhZ2VfYmlkcywgY29sID0gImJsdWUiLCBsdHkgPSAxKQphYmxpbmUoaCA9IGF2ZXJhZ2VfYXNrcywgY29sID0gInJlZCIsIGx0eSA9IDEpCgpgYGAKCiMjIyBTdGFydCBGcm9tIEhlcmUKCgojIyBzZXQgMSAoNiBpbmZvcm1lZCkKCmBgYHtyfQojIEluaXRpYWxpemUgbWF0cmljZXMgdG8gc3RvcmUgYXZlcmFnZXMgZm9yIGVhY2ggcG9zaXRpb24KYXZlcmFnZV90cnVlIDwtIG1hdHJpeChOQSwgbnJvdyA9IDEwMCwgbmNvbCA9IDEwKQphdmVyYWdlX2V4cGVjdGVkIDwtIG1hdHJpeChOQSwgbnJvdyA9IDEwMCwgbmNvbCA9IDEwKQoKIyBMb29wIHRocm91Z2ggZWFjaCBzaW11bGF0aW9uIChuKQpmb3IgKG4gaW4gMToxMCkgewogICMgRXh0cmFjdCBUcnVlIHZhbHVlcyBmcm9tIHRoZSBhZ2dyZWdhdGVkX3Jlc3VsdHNfNCBkYXRhZnJhbWUKICBUcnVlVmFsdWVzX3NldDEgPC0gc3Ryc3BsaXQoZ3N1YigiXFxbfFxcXSIsICIiLCB1bmxpc3QoYWdncmVnYXRlZF9yZXN1bHRzXzFbbiwgMl0pKSwgIiwgIikKICAKICAjIEV4dHJhY3QgRXhwZWN0ZWQgdmFsdWVzIGZyb20gdGhlIGFnZ3JlZ2F0ZWRfcmVzdWx0c180IGRhdGFmcmFtZQogIEV4cGVjdGVkVmFsdWVzX3NldDEgPC0gc3Ryc3BsaXQoZ3N1YigiXFxbfFxcXSIsICIiLCB1bmxpc3QoYWdncmVnYXRlZF9yZXN1bHRzXzFbbiwgM10pKSwgIiwgIikKICAKICAjIExvb3AgdGhyb3VnaCBlYWNoIHBvc2l0aW9uIChpKQogIGZvciAoaSBpbiAxOjEwMCkgewogICAgIyBFeHRyYWN0IFRydWUgYW5kIEV4cGVjdGVkIHZhbHVlcyBmb3IgdGhlIGktdGggcG9zaXRpb24KICAgIFRydWVfdmFsdWVzIDwtIHNhcHBseShUcnVlVmFsdWVzX3NldDEsIGZ1bmN0aW9uKHgpIGFzLm51bWVyaWMoeFtpXSkpCiAgICBFeHBlY3RlZF92YWx1ZXMgPC0gc2FwcGx5KEV4cGVjdGVkVmFsdWVzX3NldDEsIGZ1bmN0aW9uKHgpIGFzLm51bWVyaWMoeFtpXSkpCiAgICAKICAgICMgQ2FsY3VsYXRlIHRoZSBhdmVyYWdlIG9mIFRydWUgYW5kIEV4cGVjdGVkIHZhbHVlcyBmb3IgdGhlIGktdGggcG9zaXRpb24KICAgIGF2ZXJhZ2VfdHJ1ZVtpLCBuXSA8LSBtZWFuKFRydWVfdmFsdWVzLCBuYS5ybSA9IFRSVUUpCiAgICBhdmVyYWdlX2V4cGVjdGVkW2ksIG5dIDwtIG1lYW4oRXhwZWN0ZWRfdmFsdWVzLCBuYS5ybSA9IFRSVUUpCiAgfQp9CgojIENhbGN1bGF0ZSB0aGUgb3ZlcmFsbCBhdmVyYWdlIGZvciBlYWNoIHBvc2l0aW9uIGFjcm9zcyBhbGwgc2ltdWxhdGlvbnMKb3ZlcmFsbF9hdmVyYWdlX3RydWUgPC0gcm93TWVhbnMoYXZlcmFnZV90cnVlLCBuYS5ybSA9IFRSVUUpCm92ZXJhbGxfYXZlcmFnZV9leHBlY3RlZCA8LSByb3dNZWFucyhhdmVyYWdlX2V4cGVjdGVkLCBuYS5ybSA9IFRSVUUpCgojIFBsb3QgdGhlIG92ZXJhbGwgYXZlcmFnZXMKcGxvdChvdmVyYWxsX2F2ZXJhZ2VfdHJ1ZSwgdHlwZSA9ICJsIiwgcGNoID0gMTYsIGNvbCA9ICJibHVlIiwgbWFpbiA9ICJPdmVyYWxsIEF2ZXJhZ2Ugb2YgVHJ1ZSB2cyBFeHBlY3RlZCBWYWx1ZXMiLCB4bGFiID0gIlBvc2l0aW9uIGluIExpc3QiLCB5bGFiID0gIlZhbHVlIiwgeWxpbSA9IGMobWluKGMob3ZlcmFsbF9hdmVyYWdlX3RydWUsIG92ZXJhbGxfYXZlcmFnZV9leHBlY3RlZCkpLCBtYXgoYyhvdmVyYWxsX2F2ZXJhZ2VfdHJ1ZSwgb3ZlcmFsbF9hdmVyYWdlX2V4cGVjdGVkKSkpKQpsaW5lcyhvdmVyYWxsX2F2ZXJhZ2VfZXhwZWN0ZWQsIHR5cGUgPSAibCIsIHBjaCA9IDE2LCBjb2wgPSAicmVkIikKbGVnZW5kKCJ0b3ByaWdodCIsIGxlZ2VuZCA9IGMoIlRydWUgVmFsdWVzIiwgIkV4cGVjdGVkIFZhbHVlcyIpLCBjb2wgPSBjKCJibHVlIiwgInJlZCIpLCBsdHkgPSAxLCBjZXggPSAwLjgpCmBgYAoKCgpgYGB7cn0KIyBJbml0aWFsaXplIG1hdHJpY2VzIHRvIHN0b3JlIGF2ZXJhZ2VzIGZvciBlYWNoIHBvc2l0aW9uCmF2ZXJhZ2VfYmlkIDwtIG1hdHJpeChOQSwgbnJvdyA9IDEwMCwgbmNvbCA9IDEwKQphdmVyYWdlX2FzayA8LSBtYXRyaXgoTkEsIG5yb3cgPSAxMDAsIG5jb2wgPSAxMCkKCiMgTG9vcCB0aHJvdWdoIGVhY2ggc2ltdWxhdGlvbiAobikKZm9yIChuIGluIDE6MTApIHsKICAjIEV4dHJhY3QgVHJ1ZSB2YWx1ZXMgZnJvbSB0aGUgYWdncmVnYXRlZF9yZXN1bHRzXzQgZGF0YWZyYW1lCiAgQmlkc19zZXQxIDwtIHN0cnNwbGl0KGdzdWIoIlxcW3xcXF0iLCAiIiwgdW5saXN0KGFnZ3JlZ2F0ZWRfcmVzdWx0c18xW24sIDRdKSksICIsICIpCiAgCiAgIyBFeHRyYWN0IEV4cGVjdGVkIHZhbHVlcyBmcm9tIHRoZSBhZ2dyZWdhdGVkX3Jlc3VsdHNfNCBkYXRhZnJhbWUKICBBc2tzX3NldDEgPC0gc3Ryc3BsaXQoZ3N1YigiXFxbfFxcXSIsICIiLCB1bmxpc3QoYWdncmVnYXRlZF9yZXN1bHRzXzFbbiwgNV0pKSwgIiwgIikKICAKICAjIExvb3AgdGhyb3VnaCBlYWNoIHBvc2l0aW9uIChpKQogIGZvciAoaSBpbiAxOjEwMCkgewogICAgIyBFeHRyYWN0IFRydWUgYW5kIEV4cGVjdGVkIHZhbHVlcyBmb3IgdGhlIGktdGggcG9zaXRpb24KICAgIEJpZHMgPC0gc2FwcGx5KEJpZHNfc2V0MSwgZnVuY3Rpb24oeCkgYXMubnVtZXJpYyh4W2ldKSkKICAgIEFza3MgPC0gc2FwcGx5KEFza3Nfc2V0MSwgZnVuY3Rpb24oeCkgYXMubnVtZXJpYyh4W2ldKSkKICAgIAogICAgIyBDYWxjdWxhdGUgdGhlIGF2ZXJhZ2Ugb2YgVHJ1ZSBhbmQgRXhwZWN0ZWQgdmFsdWVzIGZvciB0aGUgaS10aCBwb3NpdGlvbgogICAgYXZlcmFnZV9iaWRbaSwgbl0gPC0gbWVhbihCaWRzLCBuYS5ybSA9IFRSVUUpCiAgICBhdmVyYWdlX2Fza1tpLCBuXSA8LSBtZWFuKEFza3MsIG5hLnJtID0gVFJVRSkKICB9Cn0KCiMgQ2FsY3VsYXRlIHRoZSBvdmVyYWxsIGF2ZXJhZ2UgZm9yIGVhY2ggcG9zaXRpb24gYWNyb3NzIGFsbCBzaW11bGF0aW9ucwpvdmVyYWxsX2F2ZXJhZ2VfYmlkIDwtIHJvd01lYW5zKGF2ZXJhZ2VfYmlkLCBuYS5ybSA9IFRSVUUpCm92ZXJhbGxfYXZlcmFnZV9hc2sgPC0gcm93TWVhbnMoYXZlcmFnZV9hc2ssIG5hLnJtID0gVFJVRSkKCiMjIFRydWUgVmFsdWUKIyBJbml0aWFsaXplIG1hdHJpY2VzIHRvIHN0b3JlIGF2ZXJhZ2VzIGZvciBlYWNoIHBvc2l0aW9uCmF2ZXJhZ2VfdHJ1ZSA8LSBtYXRyaXgoTkEsIG5yb3cgPSAxMDAsIG5jb2wgPSAxMCkKYXZlcmFnZV9leHBlY3RlZCA8LSBtYXRyaXgoTkEsIG5yb3cgPSAxMDAsIG5jb2wgPSAxMCkKCiMgTG9vcCB0aHJvdWdoIGVhY2ggc2ltdWxhdGlvbiAobikKZm9yIChuIGluIDE6MTApIHsKICAjIEV4dHJhY3QgVHJ1ZSB2YWx1ZXMgZnJvbSB0aGUgYWdncmVnYXRlZF9yZXN1bHRzXzQgZGF0YWZyYW1lCiAgVHJ1ZVZhbHVlc19zZXQxIDwtIHN0cnNwbGl0KGdzdWIoIlxcW3xcXF0iLCAiIiwgdW5saXN0KGFnZ3JlZ2F0ZWRfcmVzdWx0c18xW24sIDJdKSksICIsICIpCiAgCiAgIyBFeHRyYWN0IEV4cGVjdGVkIHZhbHVlcyBmcm9tIHRoZSBhZ2dyZWdhdGVkX3Jlc3VsdHNfNCBkYXRhZnJhbWUKICBFeHBlY3RlZFZhbHVlc19zZXQxIDwtIHN0cnNwbGl0KGdzdWIoIlxcW3xcXF0iLCAiIiwgdW5saXN0KGFnZ3JlZ2F0ZWRfcmVzdWx0c18xW24sIDNdKSksICIsICIpCiAgCiAgIyBMb29wIHRocm91Z2ggZWFjaCBwb3NpdGlvbiAoaSkKICBmb3IgKGkgaW4gMToxMDApIHsKICAgICMgRXh0cmFjdCBUcnVlIGFuZCBFeHBlY3RlZCB2YWx1ZXMgZm9yIHRoZSBpLXRoIHBvc2l0aW9uCiAgICBUcnVlX3ZhbHVlcyA8LSBzYXBwbHkoVHJ1ZVZhbHVlc19zZXQxLCBmdW5jdGlvbih4KSBhcy5udW1lcmljKHhbaV0pKQogICAgRXhwZWN0ZWRfdmFsdWVzIDwtIHNhcHBseShFeHBlY3RlZFZhbHVlc19zZXQxLCBmdW5jdGlvbih4KSBhcy5udW1lcmljKHhbaV0pKQogICAgCiAgICAjIENhbGN1bGF0ZSB0aGUgYXZlcmFnZSBvZiBUcnVlIGFuZCBFeHBlY3RlZCB2YWx1ZXMgZm9yIHRoZSBpLXRoIHBvc2l0aW9uCiAgICBhdmVyYWdlX3RydWVbaSwgbl0gPC0gbWVhbihUcnVlX3ZhbHVlcywgbmEucm0gPSBUUlVFKQogICAgYXZlcmFnZV9leHBlY3RlZFtpLCBuXSA8LSBtZWFuKEV4cGVjdGVkX3ZhbHVlcywgbmEucm0gPSBUUlVFKQogIH0KfQoKIyBDYWxjdWxhdGUgdGhlIG92ZXJhbGwgYXZlcmFnZSBmb3IgZWFjaCBwb3NpdGlvbiBhY3Jvc3MgYWxsIHNpbXVsYXRpb25zCm92ZXJhbGxfYXZlcmFnZV90cnVlIDwtIHJvd01lYW5zKGF2ZXJhZ2VfdHJ1ZSwgbmEucm0gPSBUUlVFKQpvdmVyYWxsX2F2ZXJhZ2VfZXhwZWN0ZWQgPC0gcm93TWVhbnMoYXZlcmFnZV9leHBlY3RlZCwgbmEucm0gPSBUUlVFKQoKIyBQbG90IHRoZSBvdmVyYWxsIGF2ZXJhZ2VzCiNwbG90KG92ZXJhbGxfYXZlcmFnZV90cnVlLCB0eXBlID0gImwiLCBwY2ggPSAxNiwgY29sID0gImJsdWUiLCBtYWluID0gIk92ZXJhbGwgQXZlcmFnZSBvZiBUcnVlIHZzIEV4cGVjdGVkIFZhbHVlcyIsIHhsYWIgPSAiUG9zaXRpb24gaW4gTGlzdCIsIHlsYWIgPSAiVmFsdWUiLCB5bGltID0gYyhtaW4oYyhvdmVyYWxsX2F2ZXJhZ2VfdHJ1ZSwgb3ZlcmFsbF9hdmVyYWdlX2V4cGVjdGVkKSksIG1heChjKG92ZXJhbGxfYXZlcmFnZV90cnVlLCBvdmVyYWxsX2F2ZXJhZ2VfZXhwZWN0ZWQpKSkpCiNsaW5lcyhvdmVyYWxsX2F2ZXJhZ2VfZXhwZWN0ZWQsIHR5cGUgPSAibCIsIHBjaCA9IDE2LCBjb2wgPSAicmVkIikKI2xlZ2VuZCgidG9wcmlnaHQiLCBsZWdlbmQgPSBjKCJUcnVlIFZhbHVlcyIsICJFeHBlY3RlZCBWYWx1ZXMiKSwgY29sID0gYygiYmx1ZSIsICJyZWQiKSwgbHR5ID0gMSwgY2V4ID0gMC44KQoKIyBQbG90IHRoZSBvdmVyYWxsIGF2ZXJhZ2VzCnBsb3Qob3ZlcmFsbF9hdmVyYWdlX2JpZCwgdHlwZSA9ICJsIiwgcGNoID0gMTYsIGNvbCA9ICJibHVlIiwgbWFpbiA9ICJPdmVyYWxsIEF2ZXJhZ2Ugb2YgQmlkcyB2cyBBc2tzICYgVHJ1ZSB2cyBFeHBlY3RlZCBWYWx1ZXMiLCB4bGFiID0gIlBvc2l0aW9uIGluIExpc3QiLCB5bGFiID0gIlZhbHVlIiwgeWxpbSA9IGMobWluKGMob3ZlcmFsbF9hdmVyYWdlX2JpZCwgb3ZlcmFsbF9hdmVyYWdlX2FzaykpLCBtYXgoYyhvdmVyYWxsX2F2ZXJhZ2VfYmlkLCBvdmVyYWxsX2F2ZXJhZ2VfYXNrKSkpKQpsaW5lcyhvdmVyYWxsX2F2ZXJhZ2VfYXNrLCB0eXBlID0gImwiLCBwY2ggPSAxNiwgY29sID0gInJlZCIpCmxpbmVzKG92ZXJhbGxfYXZlcmFnZV90cnVlLCB0eXBlID0gImwiLCBwY2ggPSAxNiwgY29sID0gImdyZWVuIikKbGluZXMob3ZlcmFsbF9hdmVyYWdlX2V4cGVjdGVkLCB0eXBlID0gImwiLCBwY2ggPSAxNiwgY29sID0gInB1cnBsZSIpCmxlZ2VuZCgidG9wcmlnaHQiLCBsZWdlbmQgPSBjKCJCaWRzIiwgIkFza3MiLCAiVHJ1ZSBWYWx1ZSIsICJFeHBlY3RlZCBWYWx1ZSIpLCBjb2wgPSBjKCJibHVlIiwgInJlZCIsICJncmVlbiIsICJwdXJwbGUiKSwgbHR5ID0gMSwgY2V4ID0gMC44KQpgYGAKCiMjIyBQaWNrIHNpbSA1IGFzIGEgZXhhbXBsZQoKYGBge3J9ClRydWVWYWx1ZV9zZXQxIDwtIHN0cnNwbGl0KGdzdWIoIlxcW3xcXF0iLCAiIiwgdW5saXN0KGFnZ3JlZ2F0ZWRfcmVzdWx0c18xWzUsIDJdKSksICIsICIpW1sxXV0KCkJpZHNfc2V0MSA8LSBzdHJzcGxpdChnc3ViKCJcXFt8XFxdIiwgIiIsIHVubGlzdChhZ2dyZWdhdGVkX3Jlc3VsdHNfMVs1LCA0XSkpLCAiLCAiKVtbMV1dCkFza3Nfc2V0MSA8LSBzdHJzcGxpdChnc3ViKCJcXFt8XFxdIiwgIiIsIHVubGlzdChhZ2dyZWdhdGVkX3Jlc3VsdHNfMVs1LCA1XSkpLCAiLCAiKVtbMV1dCgpwbG90KFRydWVWYWx1ZV9zZXQxLCAKICAgICB0eXBlID0gImwiLCAKICAgICBwY2ggPSAxNiwgCiAgICAgY29sID0gImdyZWVuIiwgCiAgICAgbWFpbiA9ICJUcnVlIFZhbHVlcyBpbiBTaW11bGF0aW9uIDUiLCAKICAgICB4bGFiID0gIkl0ZXJhdGlvbiIsIAogICAgIHlsYWIgPSAiVmFsdWUiLCAKICAgICB5bGltID0gYyhtaW4oYyhhcy5udW1lcmljKFRydWVWYWx1ZV9zZXQxKSwgYXMubnVtZXJpYyhCaWRzX3NldDEpLCBhcy5udW1lcmljKEFza3Nfc2V0MSkpKSwgCiAgICAgICAgICAgICAgbWF4KGMoYXMubnVtZXJpYyhUcnVlVmFsdWVfc2V0MSksIGFzLm51bWVyaWMoQmlkc19zZXQxKSwgYXMubnVtZXJpYyhBc2tzX3NldDEpKSkpKQpsaW5lcyhCaWRzX3NldDEsIHR5cGUgPSAibCIsIHBjaCA9IDE2LCBjb2wgPSAiYmx1ZSIpCmxpbmVzKEFza3Nfc2V0MSwgdHlwZSA9ICJsIiwgcGNoID0gMTYsIGNvbCA9ICJyZWQiKQpsZWdlbmQoInRvcGxlZnQiLCBsZWdlbmQgPSBjKCJCaWRzIiwgIkFza3MiLCAiVHJ1ZSBWYWx1ZSIpLCBjb2wgPSBjKCJibHVlIiwgInJlZCIsICJncmVlbiIpLCBsdHkgPSAxLCBjZXggPSAwLjgpCgpgYGAKCmBgYHtyfQpNTV9wbmxfc2V0MSA8LSBzdHJzcGxpdChnc3ViKCJcXFt8XFxdIiwgIiIsIHVubGlzdChhZ2dyZWdhdGVkX3Jlc3VsdHNfMVs1LCA2XSkpLCAiLCAiKVtbMV1dCkluZm9ybWVkMV9wbmxfc2V0MSA8LSBzdHJzcGxpdChnc3ViKCJcXFt8XFxdIiwgIiIsIHVubGlzdChhZ2dyZWdhdGVkX3Jlc3VsdHNfMVs1LCA4XSkpLCAiLCAiKVtbMV1dCkluZm9ybWVkMl9wbmxfc2V0MSA8LSBzdHJzcGxpdChnc3ViKCJcXFt8XFxdIiwgIiIsIHVubGlzdChhZ2dyZWdhdGVkX3Jlc3VsdHNfMVs1LCAxMF0pKSwgIiwgIilbWzFdXQpJbmZvcm1lZDNfcG5sX3NldDEgPC0gc3Ryc3BsaXQoZ3N1YigiXFxbfFxcXSIsICIiLCB1bmxpc3QoYWdncmVnYXRlZF9yZXN1bHRzXzFbNSwgMTJdKSksICIsICIpW1sxXV0KSW5mb3JtZWQ0X3BubF9zZXQxIDwtIHN0cnNwbGl0KGdzdWIoIlxcW3xcXF0iLCAiIiwgdW5saXN0KGFnZ3JlZ2F0ZWRfcmVzdWx0c18xWzUsIDE0XSkpLCAiLCAiKVtbMV1dCkluZm9ybWVkNV9wbmxfc2V0MSA8LSBzdHJzcGxpdChnc3ViKCJcXFt8XFxdIiwgIiIsIHVubGlzdChhZ2dyZWdhdGVkX3Jlc3VsdHNfMVs1LCAxNl0pKSwgIiwgIilbWzFdXQpJbmZvcm1lZDZfcG5sX3NldDEgPC0gc3Ryc3BsaXQoZ3N1YigiXFxbfFxcXSIsICIiLCB1bmxpc3QoYWdncmVnYXRlZF9yZXN1bHRzXzFbNSwgMThdKSksICIsICIpW1sxXV0KCiNCaWRzX3NldDEgPC0gc3Ryc3BsaXQoZ3N1YigiXFxbfFxcXSIsICIiLCB1bmxpc3QoYWdncmVnYXRlZF9yZXN1bHRzXzFbNSwgNF0pKSwgIiwgIilbWzFdXQojQXNrc19zZXQxIDwtIHN0cnNwbGl0KGdzdWIoIlxcW3xcXF0iLCAiIiwgdW5saXN0KGFnZ3JlZ2F0ZWRfcmVzdWx0c18xWzUsIDVdKSksICIsICIpW1sxXV0KCnBsb3QoTU1fcG5sX3NldDEsIAogICAgIHR5cGUgPSAibCIsIAogICAgIHBjaCA9IDE2LCAKICAgICBjb2wgPSAiYmxhY2siLCAKICAgICBtYWluID0gIlBOTCBTaW11bGF0aW9uIDUiLCAKICAgICB4bGFiID0gIlBvc2l0aW9uIGluIExpc3QiLCAKICAgICB5bGFiID0gIlZhbHVlIiwKICAgICB5bGltID0gYyhtaW4oYyhhcy5udW1lcmljKE1NX3BubF9zZXQxKSwgYXMubnVtZXJpYyhJbmZvcm1lZDFfcG5sX3NldDEpLCBhcy5udW1lcmljKEluZm9ybWVkMl9wbmxfc2V0MSksIGFzLm51bWVyaWMoSW5mb3JtZWQzX3BubF9zZXQxKSwgYXMubnVtZXJpYyhJbmZvcm1lZDRfcG5sX3NldDEpLCBhcy5udW1lcmljKEluZm9ybWVkNV9wbmxfc2V0MSksIGFzLm51bWVyaWMoSW5mb3JtZWQ2X3BubF9zZXQxKSkpLCAKICAgICAgICAgICAgICBtYXgoYyhhcy5udW1lcmljKE1NX3BubF9zZXQxKSwgYXMubnVtZXJpYyhJbmZvcm1lZDFfcG5sX3NldDEpLCBhcy5udW1lcmljKEluZm9ybWVkMl9wbmxfc2V0MSksIGFzLm51bWVyaWMoSW5mb3JtZWQzX3BubF9zZXQxKSwgYXMubnVtZXJpYyhJbmZvcm1lZDRfcG5sX3NldDEpLCBhcy5udW1lcmljKEluZm9ybWVkNV9wbmxfc2V0MSksIGFzLm51bWVyaWMoSW5mb3JtZWQ2X3BubF9zZXQxKSkpKSkKCmxpbmVzKEluZm9ybWVkMV9wbmxfc2V0MSwgdHlwZSA9ICJsIiwgcGNoID0gMTYsIGNvbCA9ICJyZWQiKQpsaW5lcyhJbmZvcm1lZDJfcG5sX3NldDEsIHR5cGUgPSAibCIsIHBjaCA9IDE2LCBjb2wgPSAiZ3JlZW4iKQpsaW5lcyhJbmZvcm1lZDNfcG5sX3NldDEsIHR5cGUgPSAibCIsIHBjaCA9IDE2LCBjb2wgPSAieWVsbG93IikKbGluZXMoSW5mb3JtZWQ0X3BubF9zZXQxLCB0eXBlID0gImwiLCBwY2ggPSAxNiwgY29sID0gImJsdWUiKQpsaW5lcyhJbmZvcm1lZDVfcG5sX3NldDEsIHR5cGUgPSAibCIsIHBjaCA9IDE2LCBjb2wgPSAicHVycGxlIikKbGluZXMoSW5mb3JtZWQ2X3BubF9zZXQxLCB0eXBlID0gImwiLCBwY2ggPSAxNiwgY29sID0gIm9yYW5nZSIpCgojIEFkZCBsZWdlbmQKbGVnZW5kKCJib3R0b21sZWZ0IiwgbGVnZW5kID0gYygiTWFya2V0IE1ha2VyIiwgIkluZm9ybWVkIDEiLCAiSW5mb3JtZWQgMiIsICJJbmZvcm1lZCAzIiwgIkluZm9ybWVkIDQiLCAiSW5mb3JtZWQgNSIsICJJbmZvcm1lZCA2IiksIGNvbCA9IGMoImJsYWNrIiwgInJlZCIsICJncmVlbiIsICJ5ZWxsb3ciLCAiYmx1ZSIsICJwdXJwbGUiLCAib3JhbmdlIiksIGx0eSA9IDEsIGNleCA9IDAuOCkKYGBgCgpgYGB7cn0KTU1fcG5sX3NldDEgPC0gc3Ryc3BsaXQoZ3N1YigiXFxbfFxcXSIsICIiLCB1bmxpc3QoYWdncmVnYXRlZF9yZXN1bHRzXzFbNSwgN10pKSwgIiwgIilbWzFdXQpJbmZvcm1lZDFfcG5sX3NldDEgPC0gc3Ryc3BsaXQoZ3N1YigiXFxbfFxcXSIsICIiLCB1bmxpc3QoYWdncmVnYXRlZF9yZXN1bHRzXzFbNSwgOV0pKSwgIiwgIilbWzFdXQpJbmZvcm1lZDJfcG5sX3NldDEgPC0gc3Ryc3BsaXQoZ3N1YigiXFxbfFxcXSIsICIiLCB1bmxpc3QoYWdncmVnYXRlZF9yZXN1bHRzXzFbNSwgMTFdKSksICIsICIpW1sxXV0KSW5mb3JtZWQzX3BubF9zZXQxIDwtIHN0cnNwbGl0KGdzdWIoIlxcW3xcXF0iLCAiIiwgdW5saXN0KGFnZ3JlZ2F0ZWRfcmVzdWx0c18xWzUsIDEzXSkpLCAiLCAiKVtbMV1dCkluZm9ybWVkNF9wbmxfc2V0MSA8LSBzdHJzcGxpdChnc3ViKCJcXFt8XFxdIiwgIiIsIHVubGlzdChhZ2dyZWdhdGVkX3Jlc3VsdHNfMVs1LCAxNV0pKSwgIiwgIilbWzFdXQpJbmZvcm1lZDVfcG5sX3NldDEgPC0gc3Ryc3BsaXQoZ3N1YigiXFxbfFxcXSIsICIiLCB1bmxpc3QoYWdncmVnYXRlZF9yZXN1bHRzXzFbNSwgMTddKSksICIsICIpW1sxXV0KSW5mb3JtZWQ2X3BubF9zZXQxIDwtIHN0cnNwbGl0KGdzdWIoIlxcW3xcXF0iLCAiIiwgdW5saXN0KGFnZ3JlZ2F0ZWRfcmVzdWx0c18xWzUsIDE5XSkpLCAiLCAiKVtbMV1dCgojQmlkc19zZXQxIDwtIHN0cnNwbGl0KGdzdWIoIlxcW3xcXF0iLCAiIiwgdW5saXN0KGFnZ3JlZ2F0ZWRfcmVzdWx0c18xWzUsIDRdKSksICIsICIpW1sxXV0KI0Fza3Nfc2V0MSA8LSBzdHJzcGxpdChnc3ViKCJcXFt8XFxdIiwgIiIsIHVubGlzdChhZ2dyZWdhdGVkX3Jlc3VsdHNfMVs1LCA1XSkpLCAiLCAiKVtbMV1dCgpwbG90KE1NX3BubF9zZXQxLCAKICAgICB0eXBlID0gImwiLCAKICAgICBwY2ggPSAxNiwgCiAgICAgY29sID0gImJsYWNrIiwgCiAgICAgbWFpbiA9ICJQT1MgaW4gc2ltIDUiLCAKICAgICB4bGFiID0gIlBvc2l0aW9uIGluIExpc3QiLCAKICAgICB5bGFiID0gIlZhbHVlIiwgCiAgICAgeWxpbSA9IGMobWluKGMoYXMubnVtZXJpYyhNTV9wbmxfc2V0MSksIGFzLm51bWVyaWMoSW5mb3JtZWQxX3BubF9zZXQxKSwgYXMubnVtZXJpYyhJbmZvcm1lZDJfcG5sX3NldDEpLCBhcy5udW1lcmljKEluZm9ybWVkM19wbmxfc2V0MSksIGFzLm51bWVyaWMoSW5mb3JtZWQ0X3BubF9zZXQxKSwgYXMubnVtZXJpYyhJbmZvcm1lZDVfcG5sX3NldDEpLCBhcy5udW1lcmljKEluZm9ybWVkNl9wbmxfc2V0MSkpKSwgCiAgICAgICAgICAgICAgbWF4KGMoYXMubnVtZXJpYyhNTV9wbmxfc2V0MSksIGFzLm51bWVyaWMoSW5mb3JtZWQxX3BubF9zZXQxKSwgYXMubnVtZXJpYyhJbmZvcm1lZDJfcG5sX3NldDEpLCBhcy5udW1lcmljKEluZm9ybWVkM19wbmxfc2V0MSksIGFzLm51bWVyaWMoSW5mb3JtZWQ0X3BubF9zZXQxKSwgYXMubnVtZXJpYyhJbmZvcm1lZDVfcG5sX3NldDEpLCBhcy5udW1lcmljKEluZm9ybWVkNl9wbmxfc2V0MSkpKSkpCgpsaW5lcyhJbmZvcm1lZDFfcG5sX3NldDEsIHR5cGUgPSAibCIsIHBjaCA9IDE2LCBjb2wgPSAicmVkIikKbGluZXMoSW5mb3JtZWQyX3BubF9zZXQxLCB0eXBlID0gImwiLCBwY2ggPSAxNiwgY29sID0gImdyZWVuIikKbGluZXMoSW5mb3JtZWQzX3BubF9zZXQxLCB0eXBlID0gImwiLCBwY2ggPSAxNiwgY29sID0gInllbGxvdyIpCmxpbmVzKEluZm9ybWVkNF9wbmxfc2V0MSwgdHlwZSA9ICJsIiwgcGNoID0gMTYsIGNvbCA9ICJibHVlIikKbGluZXMoSW5mb3JtZWQ1X3BubF9zZXQxLCB0eXBlID0gImwiLCBwY2ggPSAxNiwgY29sID0gInB1cnBsZSIpCmxpbmVzKEluZm9ybWVkNl9wbmxfc2V0MSwgdHlwZSA9ICJsIiwgcGNoID0gMTYsIGNvbCA9ICJvcmFuZ2UiKQoKIyBBZGQgbGVnZW5kCmxlZ2VuZCgiYm90dG9tbGVmdCIsIGxlZ2VuZCA9IGMoIk1hcmtldCBNYWtlciIsICJJbmZvcm1lZCAxIiwgIkluZm9ybWVkIDIiLCAiSW5mb3JtZWQgMyIsICJJbmZvcm1lZCA0IiwgIkluZm9ybWVkIDUiLCAiSW5mb3JtZWQgNiIpLCBjb2wgPSBjKCJibGFjayIsICJyZWQiLCAiZ3JlZW4iLCAieWVsbG93IiwgImJsdWUiLCAicHVycGxlIiwgIm9yYW5nZSIpLCBsdHkgPSAxLCBjZXggPSAwLjgpCmBgYAoKCgpgYGB7cn0KIyBJbml0aWFsaXplIG1hdHJpY2VzIHRvIHN0b3JlIGF2ZXJhZ2VzIGZvciBlYWNoIHBvc2l0aW9uCmF2ZXJhZ2VfTU1fcG5sIDwtIG1hdHJpeChOQSwgbnJvdyA9IDEwMCwgbmNvbCA9IDEwKQphdmVyYWdlX0luZm9ybWVkMV9wbmwgPC0gbWF0cml4KE5BLCBucm93ID0gMTAwLCBuY29sID0gMTApCmF2ZXJhZ2VfSW5mb3JtZWQyX3BubCA8LSBtYXRyaXgoTkEsIG5yb3cgPSAxMDAsIG5jb2wgPSAxMCkKYXZlcmFnZV9JbmZvcm1lZDNfcG5sIDwtIG1hdHJpeChOQSwgbnJvdyA9IDEwMCwgbmNvbCA9IDEwKQphdmVyYWdlX0luZm9ybWVkNF9wbmwgPC0gbWF0cml4KE5BLCBucm93ID0gMTAwLCBuY29sID0gMTApCmF2ZXJhZ2VfSW5mb3JtZWQ1X3BubCA8LSBtYXRyaXgoTkEsIG5yb3cgPSAxMDAsIG5jb2wgPSAxMCkKYXZlcmFnZV9JbmZvcm1lZDZfcG5sIDwtIG1hdHJpeChOQSwgbnJvdyA9IDEwMCwgbmNvbCA9IDEwKQoKIyBMb29wIHRocm91Z2ggZWFjaCBzaW11bGF0aW9uIChuKQpmb3IgKG4gaW4gMToxMCkgewoKICBNTV9wbmxfc2V0MSA8LSBzdHJzcGxpdChnc3ViKCJcXFt8XFxdIiwgIiIsIHVubGlzdChhZ2dyZWdhdGVkX3Jlc3VsdHNfMVtuLCA2XSkpLCAiLCAiKQoKICBJbmZvcm1lZDFfcG5sX3NldDEgPC0gc3Ryc3BsaXQoZ3N1YigiXFxbfFxcXSIsICIiLCB1bmxpc3QoYWdncmVnYXRlZF9yZXN1bHRzXzFbbiwgOF0pKSwgIiwgIikKICAKICBJbmZvcm1lZDJfcG5sX3NldDEgPC0gc3Ryc3BsaXQoZ3N1YigiXFxbfFxcXSIsICIiLCB1bmxpc3QoYWdncmVnYXRlZF9yZXN1bHRzXzFbbiwgMTBdKSksICIsICIpCiAgCiAgSW5mb3JtZWQzX3BubF9zZXQxIDwtIHN0cnNwbGl0KGdzdWIoIlxcW3xcXF0iLCAiIiwgdW5saXN0KGFnZ3JlZ2F0ZWRfcmVzdWx0c18xW24sIDEyXSkpLCAiLCAiKQogIAogIEluZm9ybWVkNF9wbmxfc2V0MSA8LSBzdHJzcGxpdChnc3ViKCJcXFt8XFxdIiwgIiIsIHVubGlzdChhZ2dyZWdhdGVkX3Jlc3VsdHNfMVtuLCAxNF0pKSwgIiwgIikKICAKICBJbmZvcm1lZDVfcG5sX3NldDEgPC0gc3Ryc3BsaXQoZ3N1YigiXFxbfFxcXSIsICIiLCB1bmxpc3QoYWdncmVnYXRlZF9yZXN1bHRzXzFbbiwgMTZdKSksICIsICIpCiAgCiAgSW5mb3JtZWQ2X3BubF9zZXQxIDwtIHN0cnNwbGl0KGdzdWIoIlxcW3xcXF0iLCAiIiwgdW5saXN0KGFnZ3JlZ2F0ZWRfcmVzdWx0c18xW24sIDE4XSkpLCAiLCAiKQogIAogICMgTG9vcCB0aHJvdWdoIGVhY2ggcG9zaXRpb24gKGkpCiAgZm9yIChpIGluIDE6MTAwKSB7CiAgICAjIEV4dHJhY3QgVHJ1ZSBhbmQgRXhwZWN0ZWQgdmFsdWVzIGZvciB0aGUgaS10aCBwb3NpdGlvbgogICAgTU1fcG5sIDwtIHNhcHBseShNTV9wbmxfc2V0MSwgZnVuY3Rpb24oeCkgYXMubnVtZXJpYyh4W2ldKSkKICAgIEluZm9ybWVkMV9wbmwgPC0gc2FwcGx5KEluZm9ybWVkMV9wbmxfc2V0MSwgZnVuY3Rpb24oeCkgYXMubnVtZXJpYyh4W2ldKSkKICAgIEluZm9ybWVkMl9wbmwgPC0gc2FwcGx5KEluZm9ybWVkMl9wbmxfc2V0MSwgZnVuY3Rpb24oeCkgYXMubnVtZXJpYyh4W2ldKSkKICAgIEluZm9ybWVkM19wbmwgPC0gc2FwcGx5KEluZm9ybWVkM19wbmxfc2V0MSwgZnVuY3Rpb24oeCkgYXMubnVtZXJpYyh4W2ldKSkKICAgIEluZm9ybWVkNF9wbmwgPC0gc2FwcGx5KEluZm9ybWVkNF9wbmxfc2V0MSwgZnVuY3Rpb24oeCkgYXMubnVtZXJpYyh4W2ldKSkKICAgIEluZm9ybWVkNV9wbmwgPC0gc2FwcGx5KEluZm9ybWVkNV9wbmxfc2V0MSwgZnVuY3Rpb24oeCkgYXMubnVtZXJpYyh4W2ldKSkKICAgIEluZm9ybWVkNl9wbmwgPC0gc2FwcGx5KEluZm9ybWVkNl9wbmxfc2V0MSwgZnVuY3Rpb24oeCkgYXMubnVtZXJpYyh4W2ldKSkKICAgIAogICAgIyBDYWxjdWxhdGUgdGhlIGF2ZXJhZ2Ugb2YgVHJ1ZSBhbmQgRXhwZWN0ZWQgdmFsdWVzIGZvciB0aGUgaS10aCBwb3NpdGlvbgogICAgYXZlcmFnZV9NTV9wbmxbaSwgbl0gPC0gbWVhbihNTV9wbmwsIG5hLnJtID0gVFJVRSkKICAgIGF2ZXJhZ2VfSW5mb3JtZWQxX3BubFtpLCBuXSA8LSBtZWFuKEluZm9ybWVkMV9wbmwsIG5hLnJtID0gVFJVRSkKICAgIGF2ZXJhZ2VfSW5mb3JtZWQyX3BubFtpLCBuXSA8LSBtZWFuKEluZm9ybWVkMl9wbmwsIG5hLnJtID0gVFJVRSkKICAgIGF2ZXJhZ2VfSW5mb3JtZWQzX3BubFtpLCBuXSA8LSBtZWFuKEluZm9ybWVkM19wbmwsIG5hLnJtID0gVFJVRSkKICAgIGF2ZXJhZ2VfSW5mb3JtZWQ0X3BubFtpLCBuXSA8LSBtZWFuKEluZm9ybWVkNF9wbmwsIG5hLnJtID0gVFJVRSkKICAgIGF2ZXJhZ2VfSW5mb3JtZWQ1X3BubFtpLCBuXSA8LSBtZWFuKEluZm9ybWVkNV9wbmwsIG5hLnJtID0gVFJVRSkKICAgIGF2ZXJhZ2VfSW5mb3JtZWQ2X3BubFtpLCBuXSA8LSBtZWFuKEluZm9ybWVkNl9wbmwsIG5hLnJtID0gVFJVRSkKICB9Cn0KCiMgQ2FsY3VsYXRlIHRoZSBvdmVyYWxsIGF2ZXJhZ2UgZm9yIGVhY2ggcG9zaXRpb24gYWNyb3NzIGFsbCBzaW11bGF0aW9ucwpvdmVyYWxsX2F2ZXJhZ2VfTU1fcG5sIDwtIHJvd01lYW5zKGF2ZXJhZ2VfTU1fcG5sLCBuYS5ybSA9IFRSVUUpCm92ZXJhbGxfYXZlcmFnZV9JbmZvcm1lZDFfcG5sIDwtIHJvd01lYW5zKGF2ZXJhZ2VfSW5mb3JtZWQxX3BubCwgbmEucm0gPSBUUlVFKQpvdmVyYWxsX2F2ZXJhZ2VfSW5mb3JtZWQyX3BubCA8LSByb3dNZWFucyhhdmVyYWdlX0luZm9ybWVkMl9wbmwsIG5hLnJtID0gVFJVRSkKb3ZlcmFsbF9hdmVyYWdlX0luZm9ybWVkM19wbmwgPC0gcm93TWVhbnMoYXZlcmFnZV9JbmZvcm1lZDNfcG5sLCBuYS5ybSA9IFRSVUUpCm92ZXJhbGxfYXZlcmFnZV9JbmZvcm1lZDRfcG5sIDwtIHJvd01lYW5zKGF2ZXJhZ2VfSW5mb3JtZWQ0X3BubCwgbmEucm0gPSBUUlVFKQpvdmVyYWxsX2F2ZXJhZ2VfSW5mb3JtZWQ1X3BubCA8LSByb3dNZWFucyhhdmVyYWdlX0luZm9ybWVkNV9wbmwsIG5hLnJtID0gVFJVRSkKb3ZlcmFsbF9hdmVyYWdlX0luZm9ybWVkNl9wbmwgPC0gcm93TWVhbnMoYXZlcmFnZV9JbmZvcm1lZDZfcG5sLCBuYS5ybSA9IFRSVUUpCgojIFBsb3QgdGhlIG92ZXJhbGwgYXZlcmFnZXMKcGxvdChvdmVyYWxsX2F2ZXJhZ2VfTU1fcG5sLCB0eXBlID0gImwiLCBwY2ggPSAxNiwgY29sID0gImJsYWNrIiwgbWFpbiA9ICJPdmVyYWxsIEF2ZXJhZ2UgUE5MIiwgeGxhYiA9ICJQb3NpdGlvbiBpbiBMaXN0IiwgeWxhYiA9ICJWYWx1ZSIsIHlsaW0gPSBjKG1pbihjKG92ZXJhbGxfYXZlcmFnZV9NTV9wbmwsIG92ZXJhbGxfYXZlcmFnZV9JbmZvcm1lZDFfcG5sLCBvdmVyYWxsX2F2ZXJhZ2VfSW5mb3JtZWQyX3BubCwgb3ZlcmFsbF9hdmVyYWdlX0luZm9ybWVkM19wbmwsIG92ZXJhbGxfYXZlcmFnZV9JbmZvcm1lZDRfcG5sLCBvdmVyYWxsX2F2ZXJhZ2VfSW5mb3JtZWQ1X3BubCwgb3ZlcmFsbF9hdmVyYWdlX0luZm9ybWVkNl9wbmwpKSwgbWF4KGMob3ZlcmFsbF9hdmVyYWdlX01NX3BubCwgb3ZlcmFsbF9hdmVyYWdlX0luZm9ybWVkMV9wbmwsIG92ZXJhbGxfYXZlcmFnZV9JbmZvcm1lZDJfcG5sLCBvdmVyYWxsX2F2ZXJhZ2VfSW5mb3JtZWQzX3BubCwgb3ZlcmFsbF9hdmVyYWdlX0luZm9ybWVkNF9wbmwsIG92ZXJhbGxfYXZlcmFnZV9JbmZvcm1lZDVfcG5sLCBvdmVyYWxsX2F2ZXJhZ2VfSW5mb3JtZWQ2X3BubCkpKSkKbGluZXMob3ZlcmFsbF9hdmVyYWdlX0luZm9ybWVkMV9wbmwsIHR5cGUgPSAibCIsIHBjaCA9IDE2LCBjb2wgPSAicmVkIikKbGluZXMob3ZlcmFsbF9hdmVyYWdlX0luZm9ybWVkMl9wbmwsIHR5cGUgPSAibCIsIHBjaCA9IDE2LCBjb2wgPSAiZ3JlZW4iKQpsaW5lcyhvdmVyYWxsX2F2ZXJhZ2VfSW5mb3JtZWQzX3BubCwgdHlwZSA9ICJsIiwgcGNoID0gMTYsIGNvbCA9ICJ5ZWxsb3ciKQpsaW5lcyhvdmVyYWxsX2F2ZXJhZ2VfSW5mb3JtZWQ0X3BubCwgdHlwZSA9ICJsIiwgcGNoID0gMTYsIGNvbCA9ICJibHVlIikKbGluZXMob3ZlcmFsbF9hdmVyYWdlX0luZm9ybWVkNV9wbmwsIHR5cGUgPSAibCIsIHBjaCA9IDE2LCBjb2wgPSAicHVycGxlIikKbGluZXMob3ZlcmFsbF9hdmVyYWdlX0luZm9ybWVkNl9wbmwsIHR5cGUgPSAibCIsIHBjaCA9IDE2LCBjb2wgPSAib3JhbmdlIikKCiMgQWRkIGxlZ2VuZApsZWdlbmQoImJvdHRvbWxlZnQiLCBsZWdlbmQgPSBjKCJNYXJrZXQgTWFrZXIiLCAiSW5mb3JtZWQgMSIsICJJbmZvcm1lZCAyIiwgIkluZm9ybWVkIDMiLCAiSW5mb3JtZWQgNCIsICJJbmZvcm1lZCA1IiwgIkluZm9ybWVkIDYiKSwgY29sID0gYygiYmxhY2siLCAicmVkIiwgImdyZWVuIiwgInllbGxvdyIsICJibHVlIiwgInB1cnBsZSIsICJvcmFuZ2UiKSwgbHR5ID0gMSwgY2V4ID0gMC44KQpgYGAKCmBgYHtyfQojIEluaXRpYWxpemUgbWF0cmljZXMgdG8gc3RvcmUgYXZlcmFnZXMgZm9yIGVhY2ggcG9zaXRpb24KYXZlcmFnZV9NTV9wb3MgPC0gbWF0cml4KE5BLCBucm93ID0gMTAwLCBuY29sID0gMTApCmF2ZXJhZ2VfSW5mb3JtZWQxX3BvcyA8LSBtYXRyaXgoTkEsIG5yb3cgPSAxMDAsIG5jb2wgPSAxMCkKYXZlcmFnZV9JbmZvcm1lZDJfcG9zIDwtIG1hdHJpeChOQSwgbnJvdyA9IDEwMCwgbmNvbCA9IDEwKQphdmVyYWdlX0luZm9ybWVkM19wb3MgPC0gbWF0cml4KE5BLCBucm93ID0gMTAwLCBuY29sID0gMTApCmF2ZXJhZ2VfSW5mb3JtZWQ0X3BvcyA8LSBtYXRyaXgoTkEsIG5yb3cgPSAxMDAsIG5jb2wgPSAxMCkKYXZlcmFnZV9JbmZvcm1lZDVfcG9zIDwtIG1hdHJpeChOQSwgbnJvdyA9IDEwMCwgbmNvbCA9IDEwKQphdmVyYWdlX0luZm9ybWVkNl9wb3MgPC0gbWF0cml4KE5BLCBucm93ID0gMTAwLCBuY29sID0gMTApCgojIExvb3AgdGhyb3VnaCBlYWNoIHNpbXVsYXRpb24gKG4pCmZvciAobiBpbiAxOjEwKSB7CgogIE1NX3Bvc19zZXQxIDwtIHN0cnNwbGl0KGdzdWIoIlxcW3xcXF0iLCAiIiwgdW5saXN0KGFnZ3JlZ2F0ZWRfcmVzdWx0c18xW24sIDddKSksICIsICIpCgogIEluZm9ybWVkMV9wb3Nfc2V0MSA8LSBzdHJzcGxpdChnc3ViKCJcXFt8XFxdIiwgIiIsIHVubGlzdChhZ2dyZWdhdGVkX3Jlc3VsdHNfMVtuLCA5XSkpLCAiLCAiKQogIAogIEluZm9ybWVkMl9wb3Nfc2V0MSA8LSBzdHJzcGxpdChnc3ViKCJcXFt8XFxdIiwgIiIsIHVubGlzdChhZ2dyZWdhdGVkX3Jlc3VsdHNfMVtuLCAxMV0pKSwgIiwgIikKICAKICBJbmZvcm1lZDNfcG9zX3NldDEgPC0gc3Ryc3BsaXQoZ3N1YigiXFxbfFxcXSIsICIiLCB1bmxpc3QoYWdncmVnYXRlZF9yZXN1bHRzXzFbbiwgMTNdKSksICIsICIpCiAgCiAgSW5mb3JtZWQ0X3Bvc19zZXQxIDwtIHN0cnNwbGl0KGdzdWIoIlxcW3xcXF0iLCAiIiwgdW5saXN0KGFnZ3JlZ2F0ZWRfcmVzdWx0c18xW24sIDE1XSkpLCAiLCAiKQogIAogIEluZm9ybWVkNV9wb3Nfc2V0MSA8LSBzdHJzcGxpdChnc3ViKCJcXFt8XFxdIiwgIiIsIHVubGlzdChhZ2dyZWdhdGVkX3Jlc3VsdHNfMVtuLCAxN10pKSwgIiwgIikKICAKICBJbmZvcm1lZDZfcG9zX3NldDEgPC0gc3Ryc3BsaXQoZ3N1YigiXFxbfFxcXSIsICIiLCB1bmxpc3QoYWdncmVnYXRlZF9yZXN1bHRzXzFbbiwgMTldKSksICIsICIpCiAgCiAgIyBMb29wIHRocm91Z2ggZWFjaCBwb3NpdGlvbiAoaSkKICBmb3IgKGkgaW4gMToxMDApIHsKICAgICMgRXh0cmFjdCBUcnVlIGFuZCBFeHBlY3RlZCB2YWx1ZXMgZm9yIHRoZSBpLXRoIHBvc2l0aW9uCiAgICBNTV9wb3MgPC0gc2FwcGx5KE1NX3Bvc19zZXQxLCBmdW5jdGlvbih4KSBhcy5udW1lcmljKHhbaV0pKQogICAgSW5mb3JtZWQxX3BvcyA8LSBzYXBwbHkoSW5mb3JtZWQxX3Bvc19zZXQxLCBmdW5jdGlvbih4KSBhcy5udW1lcmljKHhbaV0pKQogICAgSW5mb3JtZWQyX3BvcyA8LSBzYXBwbHkoSW5mb3JtZWQyX3Bvc19zZXQxLCBmdW5jdGlvbih4KSBhcy5udW1lcmljKHhbaV0pKQogICAgSW5mb3JtZWQzX3BvcyA8LSBzYXBwbHkoSW5mb3JtZWQzX3Bvc19zZXQxLCBmdW5jdGlvbih4KSBhcy5udW1lcmljKHhbaV0pKQogICAgSW5mb3JtZWQ0X3BvcyA8LSBzYXBwbHkoSW5mb3JtZWQ0X3Bvc19zZXQxLCBmdW5jdGlvbih4KSBhcy5udW1lcmljKHhbaV0pKQogICAgSW5mb3JtZWQ1X3BvcyA8LSBzYXBwbHkoSW5mb3JtZWQ1X3Bvc19zZXQxLCBmdW5jdGlvbih4KSBhcy5udW1lcmljKHhbaV0pKQogICAgSW5mb3JtZWQ2X3BvcyA8LSBzYXBwbHkoSW5mb3JtZWQ2X3Bvc19zZXQxLCBmdW5jdGlvbih4KSBhcy5udW1lcmljKHhbaV0pKQogICAgCiAgICAjIENhbGN1bGF0ZSB0aGUgYXZlcmFnZSBvZiBUcnVlIGFuZCBFeHBlY3RlZCB2YWx1ZXMgZm9yIHRoZSBpLXRoIHBvc2l0aW9uCiAgICBhdmVyYWdlX01NX3Bvc1tpLCBuXSA8LSBtZWFuKE1NX3BvcywgbmEucm0gPSBUUlVFKQogICAgYXZlcmFnZV9JbmZvcm1lZDFfcG9zW2ksIG5dIDwtIG1lYW4oSW5mb3JtZWQxX3BvcywgbmEucm0gPSBUUlVFKQogICAgYXZlcmFnZV9JbmZvcm1lZDJfcG9zW2ksIG5dIDwtIG1lYW4oSW5mb3JtZWQyX3BvcywgbmEucm0gPSBUUlVFKQogICAgYXZlcmFnZV9JbmZvcm1lZDNfcG9zW2ksIG5dIDwtIG1lYW4oSW5mb3JtZWQzX3BvcywgbmEucm0gPSBUUlVFKQogICAgYXZlcmFnZV9JbmZvcm1lZDRfcG9zW2ksIG5dIDwtIG1lYW4oSW5mb3JtZWQ0X3BvcywgbmEucm0gPSBUUlVFKQogICAgYXZlcmFnZV9JbmZvcm1lZDVfcG9zW2ksIG5dIDwtIG1lYW4oSW5mb3JtZWQ1X3BvcywgbmEucm0gPSBUUlVFKQogICAgYXZlcmFnZV9JbmZvcm1lZDZfcG9zW2ksIG5dIDwtIG1lYW4oSW5mb3JtZWQ2X3BvcywgbmEucm0gPSBUUlVFKQogIH0KfQoKIyBDYWxjdWxhdGUgdGhlIG92ZXJhbGwgYXZlcmFnZSBmb3IgZWFjaCBwb3NpdGlvbiBhY3Jvc3MgYWxsIHNpbXVsYXRpb25zCm92ZXJhbGxfYXZlcmFnZV9NTV9wb3MgPC0gcm93TWVhbnMoYXZlcmFnZV9NTV9wb3MsIG5hLnJtID0gVFJVRSkKb3ZlcmFsbF9hdmVyYWdlX0luZm9ybWVkMV9wb3MgPC0gcm93TWVhbnMoYXZlcmFnZV9JbmZvcm1lZDFfcG9zLCBuYS5ybSA9IFRSVUUpCm92ZXJhbGxfYXZlcmFnZV9JbmZvcm1lZDJfcG9zIDwtIHJvd01lYW5zKGF2ZXJhZ2VfSW5mb3JtZWQyX3BvcywgbmEucm0gPSBUUlVFKQpvdmVyYWxsX2F2ZXJhZ2VfSW5mb3JtZWQzX3BvcyA8LSByb3dNZWFucyhhdmVyYWdlX0luZm9ybWVkM19wb3MsIG5hLnJtID0gVFJVRSkKb3ZlcmFsbF9hdmVyYWdlX0luZm9ybWVkNF9wb3MgPC0gcm93TWVhbnMoYXZlcmFnZV9JbmZvcm1lZDRfcG9zLCBuYS5ybSA9IFRSVUUpCm92ZXJhbGxfYXZlcmFnZV9JbmZvcm1lZDVfcG9zIDwtIHJvd01lYW5zKGF2ZXJhZ2VfSW5mb3JtZWQ1X3BvcywgbmEucm0gPSBUUlVFKQpvdmVyYWxsX2F2ZXJhZ2VfSW5mb3JtZWQ2X3BvcyA8LSByb3dNZWFucyhhdmVyYWdlX0luZm9ybWVkNl9wb3MsIG5hLnJtID0gVFJVRSkKCiMgUGxvdCB0aGUgb3ZlcmFsbCBhdmVyYWdlcwpwbG90KG92ZXJhbGxfYXZlcmFnZV9NTV9wb3MsIHR5cGUgPSAibCIsIHBjaCA9IDE2LCBjb2wgPSAiYmxhY2siLCBtYWluID0gIk92ZXJhbGwgQXZlcmFnZSBQb3NpdGlvbiIsIHhsYWIgPSAiUG9zaXRpb24gaW4gTGlzdCIsIHlsYWIgPSAiVmFsdWUiLCB5bGltID0gYyhtaW4oYyhvdmVyYWxsX2F2ZXJhZ2VfTU1fcG9zLCBvdmVyYWxsX2F2ZXJhZ2VfSW5mb3JtZWQxX3Bvcywgb3ZlcmFsbF9hdmVyYWdlX0luZm9ybWVkMl9wb3MsIG92ZXJhbGxfYXZlcmFnZV9JbmZvcm1lZDNfcG9zLCBvdmVyYWxsX2F2ZXJhZ2VfSW5mb3JtZWQ0X3Bvcywgb3ZlcmFsbF9hdmVyYWdlX0luZm9ybWVkNV9wb3MsIG92ZXJhbGxfYXZlcmFnZV9JbmZvcm1lZDZfcG9zKSksIG1heChjKG92ZXJhbGxfYXZlcmFnZV9NTV9wb3MsIG92ZXJhbGxfYXZlcmFnZV9JbmZvcm1lZDFfcG9zLCBvdmVyYWxsX2F2ZXJhZ2VfSW5mb3JtZWQyX3Bvcywgb3ZlcmFsbF9hdmVyYWdlX0luZm9ybWVkM19wb3MsIG92ZXJhbGxfYXZlcmFnZV9JbmZvcm1lZDRfcG9zLCBvdmVyYWxsX2F2ZXJhZ2VfSW5mb3JtZWQ1X3Bvcywgb3ZlcmFsbF9hdmVyYWdlX0luZm9ybWVkNl9wb3MpKSkpCgojZm9yIChpIGluIHNlcV9hbG9uZyhvdmVyYWxsX2F2ZXJhZ2VfTU1fcG9zKSkgewogICNpZiAob3ZlcmFsbF9hdmVyYWdlX01NX3Bvc1tpXSAhPSAwKSB7CiAgICAjcG9pbnRzKGksIG92ZXJhbGxfYXZlcmFnZV9NTV9wb3NbaV0sIGNvbCA9ICJyZWQiLCBwY2ggPSAxNikKICAjfQojfQoKI3BvaW50cyhvdmVyYWxsX2F2ZXJhZ2VfTU1fcG9zLCBjb2wgPSAicmVkIiwgcGNoID0gMTYpCmxpbmVzKG92ZXJhbGxfYXZlcmFnZV9JbmZvcm1lZDFfcG9zLCB0eXBlID0gImwiLCBwY2ggPSAxNiwgY29sID0gInJlZCIpCmxpbmVzKG92ZXJhbGxfYXZlcmFnZV9JbmZvcm1lZDJfcG9zLCB0eXBlID0gImwiLCBwY2ggPSAxNiwgY29sID0gImdyZWVuIikKbGluZXMob3ZlcmFsbF9hdmVyYWdlX0luZm9ybWVkM19wb3MsIHR5cGUgPSAibCIsIHBjaCA9IDE2LCBjb2wgPSAieWVsbG93IikKbGluZXMob3ZlcmFsbF9hdmVyYWdlX0luZm9ybWVkNF9wb3MsIHR5cGUgPSAibCIsIHBjaCA9IDE2LCBjb2wgPSAiYmx1ZSIpCmxpbmVzKG92ZXJhbGxfYXZlcmFnZV9JbmZvcm1lZDVfcG9zLCB0eXBlID0gImwiLCBwY2ggPSAxNiwgY29sID0gInB1cnBsZSIpCmxpbmVzKG92ZXJhbGxfYXZlcmFnZV9JbmZvcm1lZDZfcG9zLCB0eXBlID0gImwiLCBwY2ggPSAxNiwgY29sID0gIm9yYW5nZSIpCgojIEFkZCBsZWdlbmQKbGVnZW5kKCJib3R0b21sZWZ0IiwgbGVnZW5kID0gYygiTWFya2V0IE1ha2VyIiwgIkluZm9ybWVkIDEiLCAiSW5mb3JtZWQgMiIsICJJbmZvcm1lZCAzIiwgIkluZm9ybWVkIDQiLCAiSW5mb3JtZWQgNSIsICJJbmZvcm1lZCA2IiksIGNvbCA9IGMoImJsYWNrIiwgInJlZCIsICJncmVlbiIsICJ5ZWxsb3ciLCAiYmx1ZSIsICJwdXJwbGUiLCAib3JhbmdlIiksIGx0eSA9IDEsIGNleCA9IDAuOCkKYGBgCgoKCiMjIHNldCAyICgxIEluZm9ybWVkICsgMSBub2lzeSBpbmZvcm1lZCArIDEgbm9pc3kgKyAxIHN0b2NoYXN0aWMgbm9pc3kgKyAxIG1yICsgMSBtb20pCgpgYGB7cn0KIyBJbml0aWFsaXplIG1hdHJpY2VzIHRvIHN0b3JlIGF2ZXJhZ2VzIGZvciBlYWNoIHBvc2l0aW9uCmF2ZXJhZ2VfdHJ1ZSA8LSBtYXRyaXgoTkEsIG5yb3cgPSAxMDAsIG5jb2wgPSAxMCkKYXZlcmFnZV9leHBlY3RlZCA8LSBtYXRyaXgoTkEsIG5yb3cgPSAxMDAsIG5jb2wgPSAxMCkKCiMgTG9vcCB0aHJvdWdoIGVhY2ggc2ltdWxhdGlvbiAobikKZm9yIChuIGluIDE6MTApIHsKICAjIEV4dHJhY3QgVHJ1ZSB2YWx1ZXMgZnJvbSB0aGUgYWdncmVnYXRlZF9yZXN1bHRzXzQgZGF0YWZyYW1lCiAgVHJ1ZVZhbHVlc19zZXQyIDwtIHN0cnNwbGl0KGdzdWIoIlxcW3xcXF0iLCAiIiwgdW5saXN0KGFnZ3JlZ2F0ZWRfcmVzdWx0c18yW24sIDJdKSksICIsICIpCiAgCiAgIyBFeHRyYWN0IEV4cGVjdGVkIHZhbHVlcyBmcm9tIHRoZSBhZ2dyZWdhdGVkX3Jlc3VsdHNfNCBkYXRhZnJhbWUKICBFeHBlY3RlZFZhbHVlc19zZXQyIDwtIHN0cnNwbGl0KGdzdWIoIlxcW3xcXF0iLCAiIiwgdW5saXN0KGFnZ3JlZ2F0ZWRfcmVzdWx0c18yW24sIDNdKSksICIsICIpCiAgCiAgIyBMb29wIHRocm91Z2ggZWFjaCBwb3NpdGlvbiAoaSkKICBmb3IgKGkgaW4gMToxMDApIHsKICAgICMgRXh0cmFjdCBUcnVlIGFuZCBFeHBlY3RlZCB2YWx1ZXMgZm9yIHRoZSBpLXRoIHBvc2l0aW9uCiAgICBUcnVlX3ZhbHVlcyA8LSBzYXBwbHkoVHJ1ZVZhbHVlc19zZXQyLCBmdW5jdGlvbih4KSBhcy5udW1lcmljKHhbaV0pKQogICAgRXhwZWN0ZWRfdmFsdWVzIDwtIHNhcHBseShFeHBlY3RlZFZhbHVlc19zZXQyLCBmdW5jdGlvbih4KSBhcy5udW1lcmljKHhbaV0pKQogICAgCiAgICAjIENhbGN1bGF0ZSB0aGUgYXZlcmFnZSBvZiBUcnVlIGFuZCBFeHBlY3RlZCB2YWx1ZXMgZm9yIHRoZSBpLXRoIHBvc2l0aW9uCiAgICBhdmVyYWdlX3RydWVbaSwgbl0gPC0gbWVhbihUcnVlX3ZhbHVlcywgbmEucm0gPSBUUlVFKQogICAgYXZlcmFnZV9leHBlY3RlZFtpLCBuXSA8LSBtZWFuKEV4cGVjdGVkX3ZhbHVlcywgbmEucm0gPSBUUlVFKQogIH0KfQoKIyBDYWxjdWxhdGUgdGhlIG92ZXJhbGwgYXZlcmFnZSBmb3IgZWFjaCBwb3NpdGlvbiBhY3Jvc3MgYWxsIHNpbXVsYXRpb25zCm92ZXJhbGxfYXZlcmFnZV90cnVlIDwtIHJvd01lYW5zKGF2ZXJhZ2VfdHJ1ZSwgbmEucm0gPSBUUlVFKQpvdmVyYWxsX2F2ZXJhZ2VfZXhwZWN0ZWQgPC0gcm93TWVhbnMoYXZlcmFnZV9leHBlY3RlZCwgbmEucm0gPSBUUlVFKQoKIyBQbG90IHRoZSBvdmVyYWxsIGF2ZXJhZ2VzCnBsb3Qob3ZlcmFsbF9hdmVyYWdlX3RydWUsIHR5cGUgPSAibCIsIHBjaCA9IDE2LCBjb2wgPSAiYmx1ZSIsIG1haW4gPSAiT3ZlcmFsbCBBdmVyYWdlIG9mIFRydWUgdnMgRXhwZWN0ZWQgVmFsdWVzIiwgeGxhYiA9ICJQb3NpdGlvbiBpbiBMaXN0IiwgeWxhYiA9ICJWYWx1ZSIsIHlsaW0gPSBjKG1pbihjKG92ZXJhbGxfYXZlcmFnZV90cnVlLCBvdmVyYWxsX2F2ZXJhZ2VfZXhwZWN0ZWQpKSwgbWF4KGMob3ZlcmFsbF9hdmVyYWdlX3RydWUsIG92ZXJhbGxfYXZlcmFnZV9leHBlY3RlZCkpKSkKbGluZXMob3ZlcmFsbF9hdmVyYWdlX2V4cGVjdGVkLCB0eXBlID0gImwiLCBwY2ggPSAxNiwgY29sID0gInJlZCIpCmxlZ2VuZCgidG9wcmlnaHQiLCBsZWdlbmQgPSBjKCJUcnVlIFZhbHVlcyIsICJFeHBlY3RlZCBWYWx1ZXMiKSwgY29sID0gYygiYmx1ZSIsICJyZWQiKSwgbHR5ID0gMSwgY2V4ID0gMC44KQpgYGAKCmBgYHtyfQojIEluaXRpYWxpemUgbWF0cmljZXMgdG8gc3RvcmUgYXZlcmFnZXMgZm9yIGVhY2ggcG9zaXRpb24KYXZlcmFnZV9iaWQgPC0gbWF0cml4KE5BLCBucm93ID0gMTAwLCBuY29sID0gMTApCmF2ZXJhZ2VfYXNrIDwtIG1hdHJpeChOQSwgbnJvdyA9IDEwMCwgbmNvbCA9IDEwKQoKIyBMb29wIHRocm91Z2ggZWFjaCBzaW11bGF0aW9uIChuKQpmb3IgKG4gaW4gMToxMCkgewogICMgRXh0cmFjdCBUcnVlIHZhbHVlcyBmcm9tIHRoZSBhZ2dyZWdhdGVkX3Jlc3VsdHNfNCBkYXRhZnJhbWUKICBCaWRzX3NldDIgPC0gc3Ryc3BsaXQoZ3N1YigiXFxbfFxcXSIsICIiLCB1bmxpc3QoYWdncmVnYXRlZF9yZXN1bHRzXzJbbiwgNF0pKSwgIiwgIikKICAKICAjIEV4dHJhY3QgRXhwZWN0ZWQgdmFsdWVzIGZyb20gdGhlIGFnZ3JlZ2F0ZWRfcmVzdWx0c180IGRhdGFmcmFtZQogIEFza3Nfc2V0MiA8LSBzdHJzcGxpdChnc3ViKCJcXFt8XFxdIiwgIiIsIHVubGlzdChhZ2dyZWdhdGVkX3Jlc3VsdHNfMltuLCA1XSkpLCAiLCAiKQogIAogICMgTG9vcCB0aHJvdWdoIGVhY2ggcG9zaXRpb24gKGkpCiAgZm9yIChpIGluIDE6MTAwKSB7CiAgICAjIEV4dHJhY3QgVHJ1ZSBhbmQgRXhwZWN0ZWQgdmFsdWVzIGZvciB0aGUgaS10aCBwb3NpdGlvbgogICAgQmlkcyA8LSBzYXBwbHkoQmlkc19zZXQyLCBmdW5jdGlvbih4KSBhcy5udW1lcmljKHhbaV0pKQogICAgQXNrcyA8LSBzYXBwbHkoQXNrc19zZXQyLCBmdW5jdGlvbih4KSBhcy5udW1lcmljKHhbaV0pKQogICAgCiAgICAjIENhbGN1bGF0ZSB0aGUgYXZlcmFnZSBvZiBUcnVlIGFuZCBFeHBlY3RlZCB2YWx1ZXMgZm9yIHRoZSBpLXRoIHBvc2l0aW9uCiAgICBhdmVyYWdlX2JpZFtpLCBuXSA8LSBtZWFuKEJpZHMsIG5hLnJtID0gVFJVRSkKICAgIGF2ZXJhZ2VfYXNrW2ksIG5dIDwtIG1lYW4oQXNrcywgbmEucm0gPSBUUlVFKQogIH0KfQoKIyBDYWxjdWxhdGUgdGhlIG92ZXJhbGwgYXZlcmFnZSBmb3IgZWFjaCBwb3NpdGlvbiBhY3Jvc3MgYWxsIHNpbXVsYXRpb25zCm92ZXJhbGxfYXZlcmFnZV9iaWQgPC0gcm93TWVhbnMoYXZlcmFnZV9iaWQsIG5hLnJtID0gVFJVRSkKb3ZlcmFsbF9hdmVyYWdlX2FzayA8LSByb3dNZWFucyhhdmVyYWdlX2FzaywgbmEucm0gPSBUUlVFKQoKIyBQbG90IHRoZSBvdmVyYWxsIGF2ZXJhZ2VzCnBsb3Qob3ZlcmFsbF9hdmVyYWdlX2JpZCwgdHlwZSA9ICJsIiwgcGNoID0gMTYsIGNvbCA9ICJibHVlIiwgbWFpbiA9ICJPdmVyYWxsIEF2ZXJhZ2Ugb2YgQmlkcyB2cyBBc2tzIiwgeGxhYiA9ICJQb3NpdGlvbiBpbiBMaXN0IiwgeWxhYiA9ICJWYWx1ZSIsIHlsaW0gPSBjKG1pbihjKG92ZXJhbGxfYXZlcmFnZV9iaWQsIG92ZXJhbGxfYXZlcmFnZV9hc2spKSwgbWF4KGMob3ZlcmFsbF9hdmVyYWdlX2JpZCwgb3ZlcmFsbF9hdmVyYWdlX2FzaykpKSkKbGluZXMob3ZlcmFsbF9hdmVyYWdlX2FzaywgdHlwZSA9ICJsIiwgcGNoID0gMTYsIGNvbCA9ICJyZWQiKQpsZWdlbmQoInRvcHJpZ2h0IiwgbGVnZW5kID0gYygiQmlkcyIsICJBc2tzIiksIGNvbCA9IGMoImJsdWUiLCAicmVkIiksIGx0eSA9IDEsIGNleCA9IDAuOCkKYGBgCgpgYGB7cn0KIyBJbml0aWFsaXplIG1hdHJpY2VzIHRvIHN0b3JlIGF2ZXJhZ2VzIGZvciBlYWNoIHBvc2l0aW9uCmF2ZXJhZ2VfYmlkIDwtIG1hdHJpeChOQSwgbnJvdyA9IDEwMCwgbmNvbCA9IDEwKQphdmVyYWdlX2FzayA8LSBtYXRyaXgoTkEsIG5yb3cgPSAxMDAsIG5jb2wgPSAxMCkKCiMgTG9vcCB0aHJvdWdoIGVhY2ggc2ltdWxhdGlvbiAobikKZm9yIChuIGluIDE6MTApIHsKICAjIEV4dHJhY3QgVHJ1ZSB2YWx1ZXMgZnJvbSB0aGUgYWdncmVnYXRlZF9yZXN1bHRzXzQgZGF0YWZyYW1lCiAgQmlkc19zZXQyIDwtIHN0cnNwbGl0KGdzdWIoIlxcW3xcXF0iLCAiIiwgdW5saXN0KGFnZ3JlZ2F0ZWRfcmVzdWx0c18yW24sIDRdKSksICIsICIpCiAgCiAgIyBFeHRyYWN0IEV4cGVjdGVkIHZhbHVlcyBmcm9tIHRoZSBhZ2dyZWdhdGVkX3Jlc3VsdHNfNCBkYXRhZnJhbWUKICBBc2tzX3NldDIgPC0gc3Ryc3BsaXQoZ3N1YigiXFxbfFxcXSIsICIiLCB1bmxpc3QoYWdncmVnYXRlZF9yZXN1bHRzXzJbbiwgNV0pKSwgIiwgIikKICAKICAjIExvb3AgdGhyb3VnaCBlYWNoIHBvc2l0aW9uIChpKQogIGZvciAoaSBpbiAxOjEwMCkgewogICAgIyBFeHRyYWN0IFRydWUgYW5kIEV4cGVjdGVkIHZhbHVlcyBmb3IgdGhlIGktdGggcG9zaXRpb24KICAgIEJpZHMgPC0gc2FwcGx5KEJpZHNfc2V0MiwgZnVuY3Rpb24oeCkgYXMubnVtZXJpYyh4W2ldKSkKICAgIEFza3MgPC0gc2FwcGx5KEFza3Nfc2V0MiwgZnVuY3Rpb24oeCkgYXMubnVtZXJpYyh4W2ldKSkKICAgIAogICAgIyBDYWxjdWxhdGUgdGhlIGF2ZXJhZ2Ugb2YgVHJ1ZSBhbmQgRXhwZWN0ZWQgdmFsdWVzIGZvciB0aGUgaS10aCBwb3NpdGlvbgogICAgYXZlcmFnZV9iaWRbaSwgbl0gPC0gbWVhbihCaWRzLCBuYS5ybSA9IFRSVUUpCiAgICBhdmVyYWdlX2Fza1tpLCBuXSA8LSBtZWFuKEFza3MsIG5hLnJtID0gVFJVRSkKICB9Cn0KCiMgQ2FsY3VsYXRlIHRoZSBvdmVyYWxsIGF2ZXJhZ2UgZm9yIGVhY2ggcG9zaXRpb24gYWNyb3NzIGFsbCBzaW11bGF0aW9ucwpvdmVyYWxsX2F2ZXJhZ2VfYmlkIDwtIHJvd01lYW5zKGF2ZXJhZ2VfYmlkLCBuYS5ybSA9IFRSVUUpCm92ZXJhbGxfYXZlcmFnZV9hc2sgPC0gcm93TWVhbnMoYXZlcmFnZV9hc2ssIG5hLnJtID0gVFJVRSkKCiMjIFRydWUgVmFsdWUKIyBJbml0aWFsaXplIG1hdHJpY2VzIHRvIHN0b3JlIGF2ZXJhZ2VzIGZvciBlYWNoIHBvc2l0aW9uCmF2ZXJhZ2VfdHJ1ZSA8LSBtYXRyaXgoTkEsIG5yb3cgPSAxMDAsIG5jb2wgPSAxMCkKYXZlcmFnZV9leHBlY3RlZCA8LSBtYXRyaXgoTkEsIG5yb3cgPSAxMDAsIG5jb2wgPSAxMCkKCiMgTG9vcCB0aHJvdWdoIGVhY2ggc2ltdWxhdGlvbiAobikKZm9yIChuIGluIDE6MTApIHsKICAjIEV4dHJhY3QgVHJ1ZSB2YWx1ZXMgZnJvbSB0aGUgYWdncmVnYXRlZF9yZXN1bHRzXzQgZGF0YWZyYW1lCiAgVHJ1ZVZhbHVlc19zZXQyIDwtIHN0cnNwbGl0KGdzdWIoIlxcW3xcXF0iLCAiIiwgdW5saXN0KGFnZ3JlZ2F0ZWRfcmVzdWx0c18yW24sIDJdKSksICIsICIpCiAgCiAgIyBFeHRyYWN0IEV4cGVjdGVkIHZhbHVlcyBmcm9tIHRoZSBhZ2dyZWdhdGVkX3Jlc3VsdHNfNCBkYXRhZnJhbWUKICBFeHBlY3RlZFZhbHVlc19zZXQyIDwtIHN0cnNwbGl0KGdzdWIoIlxcW3xcXF0iLCAiIiwgdW5saXN0KGFnZ3JlZ2F0ZWRfcmVzdWx0c18yW24sIDNdKSksICIsICIpCiAgCiAgIyBMb29wIHRocm91Z2ggZWFjaCBwb3NpdGlvbiAoaSkKICBmb3IgKGkgaW4gMToxMDApIHsKICAgICMgRXh0cmFjdCBUcnVlIGFuZCBFeHBlY3RlZCB2YWx1ZXMgZm9yIHRoZSBpLXRoIHBvc2l0aW9uCiAgICBUcnVlX3ZhbHVlcyA8LSBzYXBwbHkoVHJ1ZVZhbHVlc19zZXQyLCBmdW5jdGlvbih4KSBhcy5udW1lcmljKHhbaV0pKQogICAgRXhwZWN0ZWRfdmFsdWVzIDwtIHNhcHBseShFeHBlY3RlZFZhbHVlc19zZXQyLCBmdW5jdGlvbih4KSBhcy5udW1lcmljKHhbaV0pKQogICAgCiAgICAjIENhbGN1bGF0ZSB0aGUgYXZlcmFnZSBvZiBUcnVlIGFuZCBFeHBlY3RlZCB2YWx1ZXMgZm9yIHRoZSBpLXRoIHBvc2l0aW9uCiAgICBhdmVyYWdlX3RydWVbaSwgbl0gPC0gbWVhbihUcnVlX3ZhbHVlcywgbmEucm0gPSBUUlVFKQogICAgYXZlcmFnZV9leHBlY3RlZFtpLCBuXSA8LSBtZWFuKEV4cGVjdGVkX3ZhbHVlcywgbmEucm0gPSBUUlVFKQogIH0KfQoKIyBDYWxjdWxhdGUgdGhlIG92ZXJhbGwgYXZlcmFnZSBmb3IgZWFjaCBwb3NpdGlvbiBhY3Jvc3MgYWxsIHNpbXVsYXRpb25zCm92ZXJhbGxfYXZlcmFnZV90cnVlIDwtIHJvd01lYW5zKGF2ZXJhZ2VfdHJ1ZSwgbmEucm0gPSBUUlVFKQpvdmVyYWxsX2F2ZXJhZ2VfZXhwZWN0ZWQgPC0gcm93TWVhbnMoYXZlcmFnZV9leHBlY3RlZCwgbmEucm0gPSBUUlVFKQoKIyBQbG90IHRoZSBvdmVyYWxsIGF2ZXJhZ2VzCiNwbG90KG92ZXJhbGxfYXZlcmFnZV90cnVlLCB0eXBlID0gImwiLCBwY2ggPSAxNiwgY29sID0gImJsdWUiLCBtYWluID0gIk92ZXJhbGwgQXZlcmFnZSBvZiBUcnVlIHZzIEV4cGVjdGVkIFZhbHVlcyIsIHhsYWIgPSAiUG9zaXRpb24gaW4gTGlzdCIsIHlsYWIgPSAiVmFsdWUiLCB5bGltID0gYyhtaW4oYyhvdmVyYWxsX2F2ZXJhZ2VfdHJ1ZSwgb3ZlcmFsbF9hdmVyYWdlX2V4cGVjdGVkKSksIG1heChjKG92ZXJhbGxfYXZlcmFnZV90cnVlLCBvdmVyYWxsX2F2ZXJhZ2VfZXhwZWN0ZWQpKSkpCiNsaW5lcyhvdmVyYWxsX2F2ZXJhZ2VfZXhwZWN0ZWQsIHR5cGUgPSAibCIsIHBjaCA9IDE2LCBjb2wgPSAicmVkIikKI2xlZ2VuZCgidG9wcmlnaHQiLCBsZWdlbmQgPSBjKCJUcnVlIFZhbHVlcyIsICJFeHBlY3RlZCBWYWx1ZXMiKSwgY29sID0gYygiYmx1ZSIsICJyZWQiKSwgbHR5ID0gMSwgY2V4ID0gMC44KQoKIyBQbG90IHRoZSBvdmVyYWxsIGF2ZXJhZ2VzCnBsb3Qob3ZlcmFsbF9hdmVyYWdlX2JpZCwgdHlwZSA9ICJsIiwgcGNoID0gMTYsIGNvbCA9ICJibHVlIiwgbWFpbiA9ICJPdmVyYWxsIEF2ZXJhZ2Ugb2YgQmlkcyB2cyBBc2tzICYgVHJ1ZSB2cyBFeHBlY3RlZCBWYWx1ZXMiLCB4bGFiID0gIlBvc2l0aW9uIGluIExpc3QiLCB5bGFiID0gIlZhbHVlIiwgeWxpbSA9IGMobWluKGMob3ZlcmFsbF9hdmVyYWdlX2JpZCwgb3ZlcmFsbF9hdmVyYWdlX2Fzaywgb3ZlcmFsbF9hdmVyYWdlX3RydWUsIG92ZXJhbGxfYXZlcmFnZV9leHBlY3RlZCkpLCBtYXgoYyhvdmVyYWxsX2F2ZXJhZ2VfYmlkLCBvdmVyYWxsX2F2ZXJhZ2VfYXNrLCBvdmVyYWxsX2F2ZXJhZ2VfdHJ1ZSwgb3ZlcmFsbF9hdmVyYWdlX2V4cGVjdGVkKSkpKQpsaW5lcyhvdmVyYWxsX2F2ZXJhZ2VfYXNrLCB0eXBlID0gImwiLCBwY2ggPSAxNiwgY29sID0gInJlZCIpCmxpbmVzKG92ZXJhbGxfYXZlcmFnZV90cnVlLCB0eXBlID0gImwiLCBwY2ggPSAxNiwgY29sID0gImdyZWVuIikKbGluZXMob3ZlcmFsbF9hdmVyYWdlX2V4cGVjdGVkLCB0eXBlID0gImwiLCBwY2ggPSAxNiwgY29sID0gInB1cnBsZSIpCmxlZ2VuZCgiYm90dG9tbGVmdCIsIGxlZ2VuZCA9IGMoIkJpZHMiLCAiQXNrcyIsICJUcnVlIFZhbHVlIiwgIkV4cGVjdGVkIFZhbHVlIiksIGNvbCA9IGMoImJsdWUiLCAicmVkIiwgImdyZWVuIiwgInB1cnBsZSIpLCBsdHkgPSAxLCBjZXggPSAwLjgpCmBgYAoKCmBgYHtyfQojIEluaXRpYWxpemUgbWF0cmljZXMgdG8gc3RvcmUgYXZlcmFnZXMgZm9yIGVhY2ggcG9zaXRpb24KYXZlcmFnZV9NTV9wbmwgPC0gbWF0cml4KE5BLCBucm93ID0gMTAwLCBuY29sID0gMTApCmF2ZXJhZ2VfSW5mb3JtZWRfcG5sIDwtIG1hdHJpeChOQSwgbnJvdyA9IDEwMCwgbmNvbCA9IDEwKQphdmVyYWdlX05vaXN5SW5mb3JtZWRfcG5sIDwtIG1hdHJpeChOQSwgbnJvdyA9IDEwMCwgbmNvbCA9IDEwKQphdmVyYWdlX05vaXN5X3BubCA8LSBtYXRyaXgoTkEsIG5yb3cgPSAxMDAsIG5jb2wgPSAxMCkKYXZlcmFnZV9TdG9jaE5vaXN5X3BubCA8LSBtYXRyaXgoTkEsIG5yb3cgPSAxMDAsIG5jb2wgPSAxMCkKYXZlcmFnZV9tcl9wbmwgPC0gbWF0cml4KE5BLCBucm93ID0gMTAwLCBuY29sID0gMTApCmF2ZXJhZ2VfbW9tX3BubCA8LSBtYXRyaXgoTkEsIG5yb3cgPSAxMDAsIG5jb2wgPSAxMCkKCiMgTG9vcCB0aHJvdWdoIGVhY2ggc2ltdWxhdGlvbiAobikKZm9yIChuIGluIDE6MTApIHsKCiAgTU1fcG5sX3NldDIgPC0gc3Ryc3BsaXQoZ3N1YigiXFxbfFxcXSIsICIiLCB1bmxpc3QoYWdncmVnYXRlZF9yZXN1bHRzXzJbbiwgNl0pKSwgIiwgIikKCiAgSW5mb3JtZWRfcG5sX3NldDIgPC0gc3Ryc3BsaXQoZ3N1YigiXFxbfFxcXSIsICIiLCB1bmxpc3QoYWdncmVnYXRlZF9yZXN1bHRzXzJbbiwgOF0pKSwgIiwgIikKICAKICBOb2lzeUluZm9ybWVkX3BubF9zZXQyIDwtIHN0cnNwbGl0KGdzdWIoIlxcW3xcXF0iLCAiIiwgdW5saXN0KGFnZ3JlZ2F0ZWRfcmVzdWx0c18yW24sIDEwXSkpLCAiLCAiKQogIAogIE5vaXN5X3BubF9zZXQyIDwtIHN0cnNwbGl0KGdzdWIoIlxcW3xcXF0iLCAiIiwgdW5saXN0KGFnZ3JlZ2F0ZWRfcmVzdWx0c18yW24sIDEyXSkpLCAiLCAiKQogIAogIFN0b2NoTm9pc3lfcG5sX3NldDIgPC0gc3Ryc3BsaXQoZ3N1YigiXFxbfFxcXSIsICIiLCB1bmxpc3QoYWdncmVnYXRlZF9yZXN1bHRzXzJbbiwgMTRdKSksICIsICIpCiAgCiAgbXJfcG5sX3NldDIgPC0gc3Ryc3BsaXQoZ3N1YigiXFxbfFxcXSIsICIiLCB1bmxpc3QoYWdncmVnYXRlZF9yZXN1bHRzXzJbbiwgMTZdKSksICIsICIpCiAgCiAgbW9tX3BubF9zZXQyIDwtIHN0cnNwbGl0KGdzdWIoIlxcW3xcXF0iLCAiIiwgdW5saXN0KGFnZ3JlZ2F0ZWRfcmVzdWx0c18yW24sIDE4XSkpLCAiLCAiKQogIAogICMgTG9vcCB0aHJvdWdoIGVhY2ggcG9zaXRpb24gKGkpCiAgZm9yIChpIGluIDE6MTAwKSB7CiAgICAjIEV4dHJhY3QgVHJ1ZSBhbmQgRXhwZWN0ZWQgdmFsdWVzIGZvciB0aGUgaS10aCBwb3NpdGlvbgogICAgTU1fcG5sIDwtIHNhcHBseShNTV9wbmxfc2V0MiwgZnVuY3Rpb24oeCkgYXMubnVtZXJpYyh4W2ldKSkKICAgIEluZm9ybWVkX3BubCA8LSBzYXBwbHkoSW5mb3JtZWRfcG5sX3NldDIsIGZ1bmN0aW9uKHgpIGFzLm51bWVyaWMoeFtpXSkpCiAgICBOb2lzeUluZm9ybWVkX3BubCA8LSBzYXBwbHkoTm9pc3lJbmZvcm1lZF9wbmxfc2V0MiwgZnVuY3Rpb24oeCkgYXMubnVtZXJpYyh4W2ldKSkKICAgIE5vaXN5X3BubCA8LSBzYXBwbHkoTm9pc3lfcG5sX3NldDIsIGZ1bmN0aW9uKHgpIGFzLm51bWVyaWMoeFtpXSkpCiAgICBTdG9jaE5vaXN5X3BubCA8LSBzYXBwbHkoU3RvY2hOb2lzeV9wbmxfc2V0MiwgZnVuY3Rpb24oeCkgYXMubnVtZXJpYyh4W2ldKSkKICAgIG1yX3BubCA8LSBzYXBwbHkobXJfcG5sX3NldDIsIGZ1bmN0aW9uKHgpIGFzLm51bWVyaWMoeFtpXSkpCiAgICBtb21fcG5sIDwtIHNhcHBseShtb21fcG5sX3NldDIsIGZ1bmN0aW9uKHgpIGFzLm51bWVyaWMoeFtpXSkpCiAgICAKICAgICMgQ2FsY3VsYXRlIHRoZSBhdmVyYWdlIG9mIFRydWUgYW5kIEV4cGVjdGVkIHZhbHVlcyBmb3IgdGhlIGktdGggcG9zaXRpb24KICAgIGF2ZXJhZ2VfTU1fcG5sW2ksIG5dIDwtIG1lYW4oTU1fcG5sLCBuYS5ybSA9IFRSVUUpCiAgICBhdmVyYWdlX0luZm9ybWVkX3BubFtpLCBuXSA8LSBtZWFuKEluZm9ybWVkX3BubCwgbmEucm0gPSBUUlVFKQogICAgYXZlcmFnZV9Ob2lzeUluZm9ybWVkX3BubFtpLCBuXSA8LSBtZWFuKE5vaXN5SW5mb3JtZWRfcG5sLCBuYS5ybSA9IFRSVUUpCiAgICBhdmVyYWdlX05vaXN5X3BubFtpLCBuXSA8LSBtZWFuKE5vaXN5X3BubCwgbmEucm0gPSBUUlVFKQogICAgYXZlcmFnZV9TdG9jaE5vaXN5X3BubFtpLCBuXSA8LSBtZWFuKFN0b2NoTm9pc3lfcG5sLCBuYS5ybSA9IFRSVUUpCiAgICBhdmVyYWdlX21yX3BubFtpLCBuXSA8LSBtZWFuKG1yX3BubCwgbmEucm0gPSBUUlVFKQogICAgYXZlcmFnZV9tb21fcG5sW2ksIG5dIDwtIG1lYW4obW9tX3BubCwgbmEucm0gPSBUUlVFKQogIH0KfQoKIyBDYWxjdWxhdGUgdGhlIG92ZXJhbGwgYXZlcmFnZSBmb3IgZWFjaCBwb3NpdGlvbiBhY3Jvc3MgYWxsIHNpbXVsYXRpb25zCm92ZXJhbGxfYXZlcmFnZV9NTV9wbmwgPC0gcm93TWVhbnMoYXZlcmFnZV9NTV9wbmwsIG5hLnJtID0gVFJVRSkKb3ZlcmFsbF9hdmVyYWdlX0luZm9ybWVkX3BubCA8LSByb3dNZWFucyhhdmVyYWdlX0luZm9ybWVkX3BubCwgbmEucm0gPSBUUlVFKQpvdmVyYWxsX2F2ZXJhZ2VfTm9pc3lJbmZvcm1lZF9wbmwgPC0gcm93TWVhbnMoYXZlcmFnZV9Ob2lzeUluZm9ybWVkX3BubCwgbmEucm0gPSBUUlVFKQpvdmVyYWxsX2F2ZXJhZ2VfTm9pc3lfcG5sIDwtIHJvd01lYW5zKGF2ZXJhZ2VfTm9pc3lfcG5sLCBuYS5ybSA9IFRSVUUpCm92ZXJhbGxfYXZlcmFnZV9TdG9jaE5vaXN5X3BubCA8LSByb3dNZWFucyhhdmVyYWdlX1N0b2NoTm9pc3lfcG5sLCBuYS5ybSA9IFRSVUUpCm92ZXJhbGxfYXZlcmFnZV9tcl9wbmwgPC0gcm93TWVhbnMoYXZlcmFnZV9tcl9wbmwsIG5hLnJtID0gVFJVRSkKb3ZlcmFsbF9hdmVyYWdlX21vbV9wbmwgPC0gcm93TWVhbnMoYXZlcmFnZV9tb21fcG5sLCBuYS5ybSA9IFRSVUUpCgojIFBsb3QgdGhlIG92ZXJhbGwgYXZlcmFnZXMKcGxvdChvdmVyYWxsX2F2ZXJhZ2VfTU1fcG5sLCB0eXBlID0gImwiLCBwY2ggPSAxNiwgY29sID0gImJsYWNrIiwgbWFpbiA9ICJPdmVyYWxsIEF2ZXJhZ2UgUE5MIiwgeGxhYiA9ICJQb3NpdGlvbiBpbiBMaXN0IiwgeWxhYiA9ICJWYWx1ZSIsIHlsaW0gPSBjKG1pbihjKG92ZXJhbGxfYXZlcmFnZV9NTV9wbmwsIG92ZXJhbGxfYXZlcmFnZV9JbmZvcm1lZF9wbmwsIG92ZXJhbGxfYXZlcmFnZV9Ob2lzeUluZm9ybWVkX3BubCwgb3ZlcmFsbF9hdmVyYWdlX05vaXN5X3BubCwgb3ZlcmFsbF9hdmVyYWdlX1N0b2NoTm9pc3lfcG5sLCBvdmVyYWxsX2F2ZXJhZ2VfbXJfcG5sLCBvdmVyYWxsX2F2ZXJhZ2VfbW9tX3BubCkpLCBtYXgoYyhvdmVyYWxsX2F2ZXJhZ2VfTU1fcG5sLCBvdmVyYWxsX2F2ZXJhZ2VfSW5mb3JtZWRfcG5sLCBvdmVyYWxsX2F2ZXJhZ2VfTm9pc3lJbmZvcm1lZF9wbmwsIG92ZXJhbGxfYXZlcmFnZV9Ob2lzeV9wbmwsIG92ZXJhbGxfYXZlcmFnZV9TdG9jaE5vaXN5X3BubCwgb3ZlcmFsbF9hdmVyYWdlX21yX3BubCwgb3ZlcmFsbF9hdmVyYWdlX21vbV9wbmwpKSkpCmxpbmVzKG92ZXJhbGxfYXZlcmFnZV9JbmZvcm1lZF9wbmwsIHR5cGUgPSAibCIsIHBjaCA9IDE2LCBjb2wgPSAicmVkIikKbGluZXMob3ZlcmFsbF9hdmVyYWdlX05vaXN5SW5mb3JtZWRfcG5sLCB0eXBlID0gImwiLCBwY2ggPSAxNiwgY29sID0gImdyZWVuIikKbGluZXMob3ZlcmFsbF9hdmVyYWdlX05vaXN5X3BubCwgdHlwZSA9ICJsIiwgcGNoID0gMTYsIGNvbCA9ICJ5ZWxsb3ciKQpsaW5lcyhvdmVyYWxsX2F2ZXJhZ2VfU3RvY2hOb2lzeV9wbmwsIHR5cGUgPSAibCIsIHBjaCA9IDE2LCBjb2wgPSAiYmx1ZSIpCmxpbmVzKG92ZXJhbGxfYXZlcmFnZV9tcl9wbmwsIHR5cGUgPSAibCIsIHBjaCA9IDE2LCBjb2wgPSAicHVycGxlIikKbGluZXMob3ZlcmFsbF9hdmVyYWdlX21vbV9wbmwsIHR5cGUgPSAibCIsIHBjaCA9IDE2LCBjb2wgPSAib3JhbmdlIikKCiMgQWRkIGxlZ2VuZApsZWdlbmQoImJvdHRvbWxlZnQiLCBsZWdlbmQgPSBjKCJNYXJrZXQgTWFrZXIiLCAiSW5mb3JtZWQiLCAiTm9pc3kgSW5mb3JtZWQiLCAiTm9pc3kiLCAiU3RvY2hhc3RpYyBOb2lzeSIsICJNZWFuIFJldmVyc2lvbiIsICJNb21lbnR1bSIpLCBjb2wgPSBjKCJibGFjayIsICJyZWQiLCAiZ3JlZW4iLCAieWVsbG93IiwgImJsdWUiLCAicHVycGxlIiwgIm9yYW5nZSIpLCBsdHkgPSAxLCBjZXggPSAwLjgpCmBgYAoKYGBge3J9CiMgSW5pdGlhbGl6ZSBtYXRyaWNlcyB0byBzdG9yZSBhdmVyYWdlcyBmb3IgZWFjaCBwb3NpdGlvbgphdmVyYWdlX01NX3BvcyA8LSBtYXRyaXgoTkEsIG5yb3cgPSAxMDAsIG5jb2wgPSAxMCkKYXZlcmFnZV9JbmZvcm1lZF9wb3MgPC0gbWF0cml4KE5BLCBucm93ID0gMTAwLCBuY29sID0gMTApCmF2ZXJhZ2VfTm9pc3lJbmZvcm1lZF9wb3MgPC0gbWF0cml4KE5BLCBucm93ID0gMTAwLCBuY29sID0gMTApCmF2ZXJhZ2VfTm9pc3lfcG9zIDwtIG1hdHJpeChOQSwgbnJvdyA9IDEwMCwgbmNvbCA9IDEwKQphdmVyYWdlX1N0b2NoTm9pc3lfcG9zIDwtIG1hdHJpeChOQSwgbnJvdyA9IDEwMCwgbmNvbCA9IDEwKQphdmVyYWdlX21yX3BvcyA8LSBtYXRyaXgoTkEsIG5yb3cgPSAxMDAsIG5jb2wgPSAxMCkKYXZlcmFnZV9tb21fcG9zIDwtIG1hdHJpeChOQSwgbnJvdyA9IDEwMCwgbmNvbCA9IDEwKQoKIyBMb29wIHRocm91Z2ggZWFjaCBzaW11bGF0aW9uIChuKQpmb3IgKG4gaW4gMToxMCkgewoKICBNTV9wb3Nfc2V0MiA8LSBzdHJzcGxpdChnc3ViKCJcXFt8XFxdIiwgIiIsIHVubGlzdChhZ2dyZWdhdGVkX3Jlc3VsdHNfMltuLCA3XSkpLCAiLCAiKQoKICBJbmZvcm1lZF9wb3Nfc2V0MiA8LSBzdHJzcGxpdChnc3ViKCJcXFt8XFxdIiwgIiIsIHVubGlzdChhZ2dyZWdhdGVkX3Jlc3VsdHNfMltuLCA5XSkpLCAiLCAiKQogIAogIE5vaXN5SW5mb3JtZWRfcG9zX3NldDIgPC0gc3Ryc3BsaXQoZ3N1YigiXFxbfFxcXSIsICIiLCB1bmxpc3QoYWdncmVnYXRlZF9yZXN1bHRzXzJbbiwgMTFdKSksICIsICIpCiAgCiAgTm9pc3lfcG9zX3NldDIgPC0gc3Ryc3BsaXQoZ3N1YigiXFxbfFxcXSIsICIiLCB1bmxpc3QoYWdncmVnYXRlZF9yZXN1bHRzXzJbbiwgMTNdKSksICIsICIpCiAgCiAgU3RvY2hOb2lzeV9wb3Nfc2V0MiA8LSBzdHJzcGxpdChnc3ViKCJcXFt8XFxdIiwgIiIsIHVubGlzdChhZ2dyZWdhdGVkX3Jlc3VsdHNfMltuLCAxNV0pKSwgIiwgIikKICAKICBtcl9wb3Nfc2V0MiA8LSBzdHJzcGxpdChnc3ViKCJcXFt8XFxdIiwgIiIsIHVubGlzdChhZ2dyZWdhdGVkX3Jlc3VsdHNfMltuLCAxN10pKSwgIiwgIikKICAKICBtb21fcG9zX3NldDIgPC0gc3Ryc3BsaXQoZ3N1YigiXFxbfFxcXSIsICIiLCB1bmxpc3QoYWdncmVnYXRlZF9yZXN1bHRzXzJbbiwgMTldKSksICIsICIpCiAgCiAgIyBMb29wIHRocm91Z2ggZWFjaCBwb3NpdGlvbiAoaSkKICBmb3IgKGkgaW4gMToxMDApIHsKICAgICMgRXh0cmFjdCBUcnVlIGFuZCBFeHBlY3RlZCB2YWx1ZXMgZm9yIHRoZSBpLXRoIHBvc2l0aW9uCiAgICBNTV9wb3MgPC0gc2FwcGx5KE1NX3Bvc19zZXQyLCBmdW5jdGlvbih4KSBhcy5udW1lcmljKHhbaV0pKQogICAgSW5mb3JtZWRfcG9zIDwtIHNhcHBseShJbmZvcm1lZF9wb3Nfc2V0MiwgZnVuY3Rpb24oeCkgYXMubnVtZXJpYyh4W2ldKSkKICAgIE5vaXN5SW5mb3JtZWRfcG9zIDwtIHNhcHBseShOb2lzeUluZm9ybWVkX3Bvc19zZXQyLCBmdW5jdGlvbih4KSBhcy5udW1lcmljKHhbaV0pKQogICAgTm9pc3lfcG9zIDwtIHNhcHBseShOb2lzeV9wb3Nfc2V0MiwgZnVuY3Rpb24oeCkgYXMubnVtZXJpYyh4W2ldKSkKICAgIFN0b2NoTm9pc3lfcG9zIDwtIHNhcHBseShTdG9jaE5vaXN5X3Bvc19zZXQyLCBmdW5jdGlvbih4KSBhcy5udW1lcmljKHhbaV0pKQogICAgbXJfcG9zIDwtIHNhcHBseShtcl9wb3Nfc2V0MiwgZnVuY3Rpb24oeCkgYXMubnVtZXJpYyh4W2ldKSkKICAgIG1vbV9wb3MgPC0gc2FwcGx5KG1vbV9wb3Nfc2V0MiwgZnVuY3Rpb24oeCkgYXMubnVtZXJpYyh4W2ldKSkKICAgIAogICAgIyBDYWxjdWxhdGUgdGhlIGF2ZXJhZ2Ugb2YgVHJ1ZSBhbmQgRXhwZWN0ZWQgdmFsdWVzIGZvciB0aGUgaS10aCBwb3NpdGlvbgogICAgYXZlcmFnZV9NTV9wb3NbaSwgbl0gPC0gbWVhbihNTV9wb3MsIG5hLnJtID0gVFJVRSkKICAgIGF2ZXJhZ2VfSW5mb3JtZWRfcG9zW2ksIG5dIDwtIG1lYW4oSW5mb3JtZWRfcG9zLCBuYS5ybSA9IFRSVUUpCiAgICBhdmVyYWdlX05vaXN5SW5mb3JtZWRfcG9zW2ksIG5dIDwtIG1lYW4oTm9pc3lJbmZvcm1lZF9wb3MsIG5hLnJtID0gVFJVRSkKICAgIGF2ZXJhZ2VfTm9pc3lfcG9zW2ksIG5dIDwtIG1lYW4oTm9pc3lfcG9zLCBuYS5ybSA9IFRSVUUpCiAgICBhdmVyYWdlX1N0b2NoTm9pc3lfcG9zW2ksIG5dIDwtIG1lYW4oU3RvY2hOb2lzeV9wb3MsIG5hLnJtID0gVFJVRSkKICAgIGF2ZXJhZ2VfbXJfcG9zW2ksIG5dIDwtIG1lYW4obXJfcG9zLCBuYS5ybSA9IFRSVUUpCiAgICBhdmVyYWdlX21vbV9wb3NbaSwgbl0gPC0gbWVhbihtb21fcG9zLCBuYS5ybSA9IFRSVUUpCiAgfQp9CgojIENhbGN1bGF0ZSB0aGUgb3ZlcmFsbCBhdmVyYWdlIGZvciBlYWNoIHBvc2l0aW9uIGFjcm9zcyBhbGwgc2ltdWxhdGlvbnMKb3ZlcmFsbF9hdmVyYWdlX01NX3BvcyA8LSByb3dNZWFucyhhdmVyYWdlX01NX3BvcywgbmEucm0gPSBUUlVFKQpvdmVyYWxsX2F2ZXJhZ2VfSW5mb3JtZWRfcG9zIDwtIHJvd01lYW5zKGF2ZXJhZ2VfSW5mb3JtZWRfcG9zLCBuYS5ybSA9IFRSVUUpCm92ZXJhbGxfYXZlcmFnZV9Ob2lzeUluZm9ybWVkX3BvcyA8LSByb3dNZWFucyhhdmVyYWdlX05vaXN5SW5mb3JtZWRfcG9zLCBuYS5ybSA9IFRSVUUpCm92ZXJhbGxfYXZlcmFnZV9Ob2lzeV9wb3MgPC0gcm93TWVhbnMoYXZlcmFnZV9Ob2lzeV9wb3MsIG5hLnJtID0gVFJVRSkKb3ZlcmFsbF9hdmVyYWdlX1N0b2NoTm9pc3lfcG9zIDwtIHJvd01lYW5zKGF2ZXJhZ2VfU3RvY2hOb2lzeV9wb3MsIG5hLnJtID0gVFJVRSkKb3ZlcmFsbF9hdmVyYWdlX21yX3BvcyA8LSByb3dNZWFucyhhdmVyYWdlX21yX3BvcywgbmEucm0gPSBUUlVFKQpvdmVyYWxsX2F2ZXJhZ2VfbW9tX3BvcyA8LSByb3dNZWFucyhhdmVyYWdlX21vbV9wb3MsIG5hLnJtID0gVFJVRSkKCiMgUGxvdCB0aGUgb3ZlcmFsbCBhdmVyYWdlcwpwbG90KG92ZXJhbGxfYXZlcmFnZV9NTV9wb3MsIHR5cGUgPSAibCIsIHBjaCA9IDE2LCBjb2wgPSAiYmxhY2siLCBtYWluID0gIk92ZXJhbGwgQXZlcmFnZSBQb3NpdGlvbiIsIHhsYWIgPSAiUG9zaXRpb24gaW4gTGlzdCIsIHlsYWIgPSAiVmFsdWUiLCB5bGltID0gYyhtaW4oYyhvdmVyYWxsX2F2ZXJhZ2VfTU1fcG9zLCBvdmVyYWxsX2F2ZXJhZ2VfSW5mb3JtZWRfcG9zLCBvdmVyYWxsX2F2ZXJhZ2VfTm9pc3lJbmZvcm1lZF9wb3MsIG92ZXJhbGxfYXZlcmFnZV9Ob2lzeV9wb3MsIG92ZXJhbGxfYXZlcmFnZV9TdG9jaE5vaXN5X3Bvcywgb3ZlcmFsbF9hdmVyYWdlX21yX3Bvcywgb3ZlcmFsbF9hdmVyYWdlX21vbV9wb3MpKSwgbWF4KGMob3ZlcmFsbF9hdmVyYWdlX01NX3Bvcywgb3ZlcmFsbF9hdmVyYWdlX0luZm9ybWVkX3Bvcywgb3ZlcmFsbF9hdmVyYWdlX05vaXN5SW5mb3JtZWRfcG9zLCBvdmVyYWxsX2F2ZXJhZ2VfTm9pc3lfcG9zLCBvdmVyYWxsX2F2ZXJhZ2VfU3RvY2hOb2lzeV9wb3MsIG92ZXJhbGxfYXZlcmFnZV9tcl9wb3MsIG92ZXJhbGxfYXZlcmFnZV9tb21fcG9zKSkpKQpsaW5lcyhvdmVyYWxsX2F2ZXJhZ2VfSW5mb3JtZWRfcG9zLCB0eXBlID0gImwiLCBwY2ggPSAxNiwgY29sID0gInJlZCIpCmxpbmVzKG92ZXJhbGxfYXZlcmFnZV9Ob2lzeUluZm9ybWVkX3BvcywgdHlwZSA9ICJsIiwgcGNoID0gMTYsIGNvbCA9ICJncmVlbiIpCmxpbmVzKG92ZXJhbGxfYXZlcmFnZV9Ob2lzeV9wb3MsIHR5cGUgPSAibCIsIHBjaCA9IDE2LCBjb2wgPSAieWVsbG93IikKbGluZXMob3ZlcmFsbF9hdmVyYWdlX1N0b2NoTm9pc3lfcG9zLCB0eXBlID0gImwiLCBwY2ggPSAxNiwgY29sID0gImJsdWUiKQpsaW5lcyhvdmVyYWxsX2F2ZXJhZ2VfbXJfcG9zLCB0eXBlID0gImwiLCBwY2ggPSAxNiwgY29sID0gInB1cnBsZSIpCmxpbmVzKG92ZXJhbGxfYXZlcmFnZV9tb21fcG9zLCB0eXBlID0gImwiLCBwY2ggPSAxNiwgY29sID0gIm9yYW5nZSIpCgojIEFkZCBsZWdlbmQKbGVnZW5kKCJib3R0b21sZWZ0IiwgbGVnZW5kID0gYygiTWFya2V0IE1ha2VyIiwgIkluZm9ybWVkIiwgIk5vaXN5IEluZm9ybWVkIiwgIk5vaXN5IiwgIlN0b2NoYXN0aWMgTm9pc3kiLCAiTWVhbiBSZXZlcnNpb24iLCAiTW9tZW50dW0iKSwgY29sID0gYygiYmxhY2siLCAicmVkIiwgImdyZWVuIiwgInllbGxvdyIsICJibHVlIiwgInB1cnBsZSIsICJvcmFuZ2UiKSwgbHR5ID0gMSwgY2V4ID0gMC44KQpgYGAKCgojIyBzZXQgMyAoMiBzdG9jaGFzdGljIG5vaXN5ICsgMiBtciArIDIgbW9tKQoKYGBge3J9CiMgSW5pdGlhbGl6ZSBtYXRyaWNlcyB0byBzdG9yZSBhdmVyYWdlcyBmb3IgZWFjaCBwb3NpdGlvbgphdmVyYWdlX3RydWUgPC0gbWF0cml4KE5BLCBucm93ID0gMTAwLCBuY29sID0gMTApCmF2ZXJhZ2VfZXhwZWN0ZWQgPC0gbWF0cml4KE5BLCBucm93ID0gMTAwLCBuY29sID0gMTApCgojIExvb3AgdGhyb3VnaCBlYWNoIHNpbXVsYXRpb24gKG4pCmZvciAobiBpbiAxOjEwKSB7CiAgIyBFeHRyYWN0IFRydWUgdmFsdWVzIGZyb20gdGhlIGFnZ3JlZ2F0ZWRfcmVzdWx0c180IGRhdGFmcmFtZQogIFRydWVWYWx1ZXNfc2V0MyA8LSBzdHJzcGxpdChnc3ViKCJcXFt8XFxdIiwgIiIsIHVubGlzdChhZ2dyZWdhdGVkX3Jlc3VsdHNfM1tuLCAyXSkpLCAiLCAiKQogIAogICMgRXh0cmFjdCBFeHBlY3RlZCB2YWx1ZXMgZnJvbSB0aGUgYWdncmVnYXRlZF9yZXN1bHRzXzQgZGF0YWZyYW1lCiAgRXhwZWN0ZWRWYWx1ZXNfc2V0MyA8LSBzdHJzcGxpdChnc3ViKCJcXFt8XFxdIiwgIiIsIHVubGlzdChhZ2dyZWdhdGVkX3Jlc3VsdHNfM1tuLCAzXSkpLCAiLCAiKQogIAogICMgTG9vcCB0aHJvdWdoIGVhY2ggcG9zaXRpb24gKGkpCiAgZm9yIChpIGluIDE6MTAwKSB7CiAgICAjIEV4dHJhY3QgVHJ1ZSBhbmQgRXhwZWN0ZWQgdmFsdWVzIGZvciB0aGUgaS10aCBwb3NpdGlvbgogICAgVHJ1ZV92YWx1ZXMgPC0gc2FwcGx5KFRydWVWYWx1ZXNfc2V0MywgZnVuY3Rpb24oeCkgYXMubnVtZXJpYyh4W2ldKSkKICAgIEV4cGVjdGVkX3ZhbHVlcyA8LSBzYXBwbHkoRXhwZWN0ZWRWYWx1ZXNfc2V0MywgZnVuY3Rpb24oeCkgYXMubnVtZXJpYyh4W2ldKSkKICAgIAogICAgIyBDYWxjdWxhdGUgdGhlIGF2ZXJhZ2Ugb2YgVHJ1ZSBhbmQgRXhwZWN0ZWQgdmFsdWVzIGZvciB0aGUgaS10aCBwb3NpdGlvbgogICAgYXZlcmFnZV90cnVlW2ksIG5dIDwtIG1lYW4oVHJ1ZV92YWx1ZXMsIG5hLnJtID0gVFJVRSkKICAgIGF2ZXJhZ2VfZXhwZWN0ZWRbaSwgbl0gPC0gbWVhbihFeHBlY3RlZF92YWx1ZXMsIG5hLnJtID0gVFJVRSkKICB9Cn0KCiMgQ2FsY3VsYXRlIHRoZSBvdmVyYWxsIGF2ZXJhZ2UgZm9yIGVhY2ggcG9zaXRpb24gYWNyb3NzIGFsbCBzaW11bGF0aW9ucwpvdmVyYWxsX2F2ZXJhZ2VfdHJ1ZSA8LSByb3dNZWFucyhhdmVyYWdlX3RydWUsIG5hLnJtID0gVFJVRSkKb3ZlcmFsbF9hdmVyYWdlX2V4cGVjdGVkIDwtIHJvd01lYW5zKGF2ZXJhZ2VfZXhwZWN0ZWQsIG5hLnJtID0gVFJVRSkKCiMgUGxvdCB0aGUgb3ZlcmFsbCBhdmVyYWdlcwpwbG90KG92ZXJhbGxfYXZlcmFnZV90cnVlLCB0eXBlID0gImwiLCBwY2ggPSAxNiwgY29sID0gImJsdWUiLCBtYWluID0gIk92ZXJhbGwgQXZlcmFnZSBvZiBUcnVlIHZzIEV4cGVjdGVkIFZhbHVlcyIsIHhsYWIgPSAiUG9zaXRpb24gaW4gTGlzdCIsIHlsYWIgPSAiVmFsdWUiLCB5bGltID0gYyhtaW4oYyhvdmVyYWxsX2F2ZXJhZ2VfdHJ1ZSwgb3ZlcmFsbF9hdmVyYWdlX2V4cGVjdGVkKSksIG1heChjKG92ZXJhbGxfYXZlcmFnZV90cnVlLCBvdmVyYWxsX2F2ZXJhZ2VfZXhwZWN0ZWQpKSkpCmxpbmVzKG92ZXJhbGxfYXZlcmFnZV9leHBlY3RlZCwgdHlwZSA9ICJsIiwgcGNoID0gMTYsIGNvbCA9ICJyZWQiKQpsZWdlbmQoInRvcHJpZ2h0IiwgbGVnZW5kID0gYygiVHJ1ZSBWYWx1ZXMiLCAiRXhwZWN0ZWQgVmFsdWVzIiksIGNvbCA9IGMoImJsdWUiLCAicmVkIiksIGx0eSA9IDEsIGNleCA9IDAuOCkKYGBgCgoKYGBge3J9CiMgSW5pdGlhbGl6ZSBtYXRyaWNlcyB0byBzdG9yZSBhdmVyYWdlcyBmb3IgZWFjaCBwb3NpdGlvbgphdmVyYWdlX2JpZCA8LSBtYXRyaXgoTkEsIG5yb3cgPSAxMDAsIG5jb2wgPSAxMCkKYXZlcmFnZV9hc2sgPC0gbWF0cml4KE5BLCBucm93ID0gMTAwLCBuY29sID0gMTApCgojIExvb3AgdGhyb3VnaCBlYWNoIHNpbXVsYXRpb24gKG4pCmZvciAobiBpbiAxOjEwKSB7CiAgIyBFeHRyYWN0IFRydWUgdmFsdWVzIGZyb20gdGhlIGFnZ3JlZ2F0ZWRfcmVzdWx0c180IGRhdGFmcmFtZQogIEJpZHNfc2V0MyA8LSBzdHJzcGxpdChnc3ViKCJcXFt8XFxdIiwgIiIsIHVubGlzdChhZ2dyZWdhdGVkX3Jlc3VsdHNfM1tuLCA0XSkpLCAiLCAiKQogIAogICMgRXh0cmFjdCBFeHBlY3RlZCB2YWx1ZXMgZnJvbSB0aGUgYWdncmVnYXRlZF9yZXN1bHRzXzQgZGF0YWZyYW1lCiAgQXNrc19zZXQzIDwtIHN0cnNwbGl0KGdzdWIoIlxcW3xcXF0iLCAiIiwgdW5saXN0KGFnZ3JlZ2F0ZWRfcmVzdWx0c18zW24sIDVdKSksICIsICIpCiAgCiAgIyBMb29wIHRocm91Z2ggZWFjaCBwb3NpdGlvbiAoaSkKICBmb3IgKGkgaW4gMToxMDApIHsKICAgICMgRXh0cmFjdCBUcnVlIGFuZCBFeHBlY3RlZCB2YWx1ZXMgZm9yIHRoZSBpLXRoIHBvc2l0aW9uCiAgICBCaWRzIDwtIHNhcHBseShCaWRzX3NldDMsIGZ1bmN0aW9uKHgpIGFzLm51bWVyaWMoeFtpXSkpCiAgICBBc2tzIDwtIHNhcHBseShBc2tzX3NldDMsIGZ1bmN0aW9uKHgpIGFzLm51bWVyaWMoeFtpXSkpCiAgICAKICAgICMgQ2FsY3VsYXRlIHRoZSBhdmVyYWdlIG9mIFRydWUgYW5kIEV4cGVjdGVkIHZhbHVlcyBmb3IgdGhlIGktdGggcG9zaXRpb24KICAgIGF2ZXJhZ2VfYmlkW2ksIG5dIDwtIG1lYW4oQmlkcywgbmEucm0gPSBUUlVFKQogICAgYXZlcmFnZV9hc2tbaSwgbl0gPC0gbWVhbihBc2tzLCBuYS5ybSA9IFRSVUUpCiAgfQp9CgojIENhbGN1bGF0ZSB0aGUgb3ZlcmFsbCBhdmVyYWdlIGZvciBlYWNoIHBvc2l0aW9uIGFjcm9zcyBhbGwgc2ltdWxhdGlvbnMKb3ZlcmFsbF9hdmVyYWdlX2JpZCA8LSByb3dNZWFucyhhdmVyYWdlX2JpZCwgbmEucm0gPSBUUlVFKQpvdmVyYWxsX2F2ZXJhZ2VfYXNrIDwtIHJvd01lYW5zKGF2ZXJhZ2VfYXNrLCBuYS5ybSA9IFRSVUUpCgojIFBsb3QgdGhlIG92ZXJhbGwgYXZlcmFnZXMKcGxvdChvdmVyYWxsX2F2ZXJhZ2VfYmlkLCB0eXBlID0gImwiLCBwY2ggPSAxNiwgY29sID0gImJsdWUiLCBtYWluID0gIk92ZXJhbGwgQXZlcmFnZSBvZiBCaWRzIHZzIEFza3MiLCB4bGFiID0gIlBvc2l0aW9uIGluIExpc3QiLCB5bGFiID0gIlZhbHVlIiwgeWxpbSA9IGMobWluKGMob3ZlcmFsbF9hdmVyYWdlX2JpZCwgb3ZlcmFsbF9hdmVyYWdlX2FzaykpLCBtYXgoYyhvdmVyYWxsX2F2ZXJhZ2VfYmlkLCBvdmVyYWxsX2F2ZXJhZ2VfYXNrKSkpKQpsaW5lcyhvdmVyYWxsX2F2ZXJhZ2VfYXNrLCB0eXBlID0gImwiLCBwY2ggPSAxNiwgY29sID0gInJlZCIpCmxlZ2VuZCgidG9wcmlnaHQiLCBsZWdlbmQgPSBjKCJCaWRzIiwgIkFza3MiKSwgY29sID0gYygiYmx1ZSIsICJyZWQiKSwgbHR5ID0gMSwgY2V4ID0gMC44KQpgYGAKCmBgYHtyfQojIEluaXRpYWxpemUgbWF0cmljZXMgdG8gc3RvcmUgYXZlcmFnZXMgZm9yIGVhY2ggcG9zaXRpb24KYXZlcmFnZV9iaWQgPC0gbWF0cml4KE5BLCBucm93ID0gMTAwLCBuY29sID0gMTApCmF2ZXJhZ2VfYXNrIDwtIG1hdHJpeChOQSwgbnJvdyA9IDEwMCwgbmNvbCA9IDEwKQoKIyBMb29wIHRocm91Z2ggZWFjaCBzaW11bGF0aW9uIChuKQpmb3IgKG4gaW4gMToxMCkgewogICMgRXh0cmFjdCBUcnVlIHZhbHVlcyBmcm9tIHRoZSBhZ2dyZWdhdGVkX3Jlc3VsdHNfNCBkYXRhZnJhbWUKICBCaWRzX3NldDMgPC0gc3Ryc3BsaXQoZ3N1YigiXFxbfFxcXSIsICIiLCB1bmxpc3QoYWdncmVnYXRlZF9yZXN1bHRzXzNbbiwgNF0pKSwgIiwgIikKICAKICAjIEV4dHJhY3QgRXhwZWN0ZWQgdmFsdWVzIGZyb20gdGhlIGFnZ3JlZ2F0ZWRfcmVzdWx0c180IGRhdGFmcmFtZQogIEFza3Nfc2V0MyA8LSBzdHJzcGxpdChnc3ViKCJcXFt8XFxdIiwgIiIsIHVubGlzdChhZ2dyZWdhdGVkX3Jlc3VsdHNfM1tuLCA1XSkpLCAiLCAiKQogIAogICMgTG9vcCB0aHJvdWdoIGVhY2ggcG9zaXRpb24gKGkpCiAgZm9yIChpIGluIDE6MTAwKSB7CiAgICAjIEV4dHJhY3QgVHJ1ZSBhbmQgRXhwZWN0ZWQgdmFsdWVzIGZvciB0aGUgaS10aCBwb3NpdGlvbgogICAgQmlkcyA8LSBzYXBwbHkoQmlkc19zZXQzLCBmdW5jdGlvbih4KSBhcy5udW1lcmljKHhbaV0pKQogICAgQXNrcyA8LSBzYXBwbHkoQXNrc19zZXQzLCBmdW5jdGlvbih4KSBhcy5udW1lcmljKHhbaV0pKQogICAgCiAgICAjIENhbGN1bGF0ZSB0aGUgYXZlcmFnZSBvZiBUcnVlIGFuZCBFeHBlY3RlZCB2YWx1ZXMgZm9yIHRoZSBpLXRoIHBvc2l0aW9uCiAgICBhdmVyYWdlX2JpZFtpLCBuXSA8LSBtZWFuKEJpZHMsIG5hLnJtID0gVFJVRSkKICAgIGF2ZXJhZ2VfYXNrW2ksIG5dIDwtIG1lYW4oQXNrcywgbmEucm0gPSBUUlVFKQogIH0KfQoKIyBDYWxjdWxhdGUgdGhlIG92ZXJhbGwgYXZlcmFnZSBmb3IgZWFjaCBwb3NpdGlvbiBhY3Jvc3MgYWxsIHNpbXVsYXRpb25zCm92ZXJhbGxfYXZlcmFnZV9iaWQgPC0gcm93TWVhbnMoYXZlcmFnZV9iaWQsIG5hLnJtID0gVFJVRSkKb3ZlcmFsbF9hdmVyYWdlX2FzayA8LSByb3dNZWFucyhhdmVyYWdlX2FzaywgbmEucm0gPSBUUlVFKQoKIyMgVHJ1ZSBWYWx1ZQojIEluaXRpYWxpemUgbWF0cmljZXMgdG8gc3RvcmUgYXZlcmFnZXMgZm9yIGVhY2ggcG9zaXRpb24KYXZlcmFnZV90cnVlIDwtIG1hdHJpeChOQSwgbnJvdyA9IDEwMCwgbmNvbCA9IDEwKQphdmVyYWdlX2V4cGVjdGVkIDwtIG1hdHJpeChOQSwgbnJvdyA9IDEwMCwgbmNvbCA9IDEwKQoKIyBMb29wIHRocm91Z2ggZWFjaCBzaW11bGF0aW9uIChuKQpmb3IgKG4gaW4gMToxMCkgewogICMgRXh0cmFjdCBUcnVlIHZhbHVlcyBmcm9tIHRoZSBhZ2dyZWdhdGVkX3Jlc3VsdHNfNCBkYXRhZnJhbWUKICBUcnVlVmFsdWVzX3NldDMgPC0gc3Ryc3BsaXQoZ3N1YigiXFxbfFxcXSIsICIiLCB1bmxpc3QoYWdncmVnYXRlZF9yZXN1bHRzXzNbbiwgMl0pKSwgIiwgIikKICAKICAjIEV4dHJhY3QgRXhwZWN0ZWQgdmFsdWVzIGZyb20gdGhlIGFnZ3JlZ2F0ZWRfcmVzdWx0c180IGRhdGFmcmFtZQogIEV4cGVjdGVkVmFsdWVzX3NldDMgPC0gc3Ryc3BsaXQoZ3N1YigiXFxbfFxcXSIsICIiLCB1bmxpc3QoYWdncmVnYXRlZF9yZXN1bHRzXzNbbiwgM10pKSwgIiwgIikKICAKICAjIExvb3AgdGhyb3VnaCBlYWNoIHBvc2l0aW9uIChpKQogIGZvciAoaSBpbiAxOjEwMCkgewogICAgIyBFeHRyYWN0IFRydWUgYW5kIEV4cGVjdGVkIHZhbHVlcyBmb3IgdGhlIGktdGggcG9zaXRpb24KICAgIFRydWVfdmFsdWVzIDwtIHNhcHBseShUcnVlVmFsdWVzX3NldDMsIGZ1bmN0aW9uKHgpIGFzLm51bWVyaWMoeFtpXSkpCiAgICBFeHBlY3RlZF92YWx1ZXMgPC0gc2FwcGx5KEV4cGVjdGVkVmFsdWVzX3NldDMsIGZ1bmN0aW9uKHgpIGFzLm51bWVyaWMoeFtpXSkpCiAgICAKICAgICMgQ2FsY3VsYXRlIHRoZSBhdmVyYWdlIG9mIFRydWUgYW5kIEV4cGVjdGVkIHZhbHVlcyBmb3IgdGhlIGktdGggcG9zaXRpb24KICAgIGF2ZXJhZ2VfdHJ1ZVtpLCBuXSA8LSBtZWFuKFRydWVfdmFsdWVzLCBuYS5ybSA9IFRSVUUpCiAgICBhdmVyYWdlX2V4cGVjdGVkW2ksIG5dIDwtIG1lYW4oRXhwZWN0ZWRfdmFsdWVzLCBuYS5ybSA9IFRSVUUpCiAgfQp9CgojIENhbGN1bGF0ZSB0aGUgb3ZlcmFsbCBhdmVyYWdlIGZvciBlYWNoIHBvc2l0aW9uIGFjcm9zcyBhbGwgc2ltdWxhdGlvbnMKb3ZlcmFsbF9hdmVyYWdlX3RydWUgPC0gcm93TWVhbnMoYXZlcmFnZV90cnVlLCBuYS5ybSA9IFRSVUUpCm92ZXJhbGxfYXZlcmFnZV9leHBlY3RlZCA8LSByb3dNZWFucyhhdmVyYWdlX2V4cGVjdGVkLCBuYS5ybSA9IFRSVUUpCgojIFBsb3QgdGhlIG92ZXJhbGwgYXZlcmFnZXMKI3Bsb3Qob3ZlcmFsbF9hdmVyYWdlX3RydWUsIHR5cGUgPSAibCIsIHBjaCA9IDE2LCBjb2wgPSAiYmx1ZSIsIG1haW4gPSAiT3ZlcmFsbCBBdmVyYWdlIG9mIFRydWUgdnMgRXhwZWN0ZWQgVmFsdWVzIiwgeGxhYiA9ICJQb3NpdGlvbiBpbiBMaXN0IiwgeWxhYiA9ICJWYWx1ZSIsIHlsaW0gPSBjKG1pbihjKG92ZXJhbGxfYXZlcmFnZV90cnVlLCBvdmVyYWxsX2F2ZXJhZ2VfZXhwZWN0ZWQpKSwgbWF4KGMob3ZlcmFsbF9hdmVyYWdlX3RydWUsIG92ZXJhbGxfYXZlcmFnZV9leHBlY3RlZCkpKSkKI2xpbmVzKG92ZXJhbGxfYXZlcmFnZV9leHBlY3RlZCwgdHlwZSA9ICJsIiwgcGNoID0gMTYsIGNvbCA9ICJyZWQiKQojbGVnZW5kKCJ0b3ByaWdodCIsIGxlZ2VuZCA9IGMoIlRydWUgVmFsdWVzIiwgIkV4cGVjdGVkIFZhbHVlcyIpLCBjb2wgPSBjKCJibHVlIiwgInJlZCIpLCBsdHkgPSAxLCBjZXggPSAwLjgpCgojIFBsb3QgdGhlIG92ZXJhbGwgYXZlcmFnZXMKcGxvdChvdmVyYWxsX2F2ZXJhZ2VfYmlkLCB0eXBlID0gImwiLCBwY2ggPSAxNiwgY29sID0gImJsdWUiLCBtYWluID0gIk92ZXJhbGwgQXZlcmFnZSBvZiBCaWRzIHZzIEFza3MgJiBUcnVlIHZzIEV4cGVjdGVkIFZhbHVlcyIsIHhsYWIgPSAiUG9zaXRpb24gaW4gTGlzdCIsIHlsYWIgPSAiVmFsdWUiLCB5bGltID0gYyhtaW4oYyhvdmVyYWxsX2F2ZXJhZ2VfYmlkLCBvdmVyYWxsX2F2ZXJhZ2VfYXNrLCBvdmVyYWxsX2F2ZXJhZ2VfdHJ1ZSwgb3ZlcmFsbF9hdmVyYWdlX2V4cGVjdGVkKSksIG1heChjKG92ZXJhbGxfYXZlcmFnZV9iaWQsIG92ZXJhbGxfYXZlcmFnZV9hc2ssIG92ZXJhbGxfYXZlcmFnZV90cnVlLCBvdmVyYWxsX2F2ZXJhZ2VfZXhwZWN0ZWQpKSkpCmxpbmVzKG92ZXJhbGxfYXZlcmFnZV9hc2ssIHR5cGUgPSAibCIsIHBjaCA9IDE2LCBjb2wgPSAicmVkIikKbGluZXMob3ZlcmFsbF9hdmVyYWdlX3RydWUsIHR5cGUgPSAibCIsIHBjaCA9IDE2LCBjb2wgPSAiZ3JlZW4iKQpsaW5lcyhvdmVyYWxsX2F2ZXJhZ2VfZXhwZWN0ZWQsIHR5cGUgPSAibCIsIHBjaCA9IDE2LCBjb2wgPSAicHVycGxlIikKbGVnZW5kKCJib3R0b21sZWZ0IiwgbGVnZW5kID0gYygiQmlkcyIsICJBc2tzIiwgIlRydWUgVmFsdWUiLCAiRXhwZWN0ZWQgVmFsdWUiKSwgY29sID0gYygiYmx1ZSIsICJyZWQiLCAiZ3JlZW4iLCAicHVycGxlIiksIGx0eSA9IDEsIGNleCA9IDAuOCkKYGBgCgoKYGBge3J9CiMgSW5pdGlhbGl6ZSBtYXRyaWNlcyB0byBzdG9yZSBhdmVyYWdlcyBmb3IgZWFjaCBwb3NpdGlvbgphdmVyYWdlX01NX3BubCA8LSBtYXRyaXgoTkEsIG5yb3cgPSAxMDAsIG5jb2wgPSAxMCkKYXZlcmFnZV9TdG9jaE5vaXN5MV9wbmwgPC0gbWF0cml4KE5BLCBucm93ID0gMTAwLCBuY29sID0gMTApCmF2ZXJhZ2VfU3RvY2hOb2lzeTJfcG5sIDwtIG1hdHJpeChOQSwgbnJvdyA9IDEwMCwgbmNvbCA9IDEwKQphdmVyYWdlX21yMV9wbmwgPC0gbWF0cml4KE5BLCBucm93ID0gMTAwLCBuY29sID0gMTApCmF2ZXJhZ2VfbXIyX3BubCA8LSBtYXRyaXgoTkEsIG5yb3cgPSAxMDAsIG5jb2wgPSAxMCkKYXZlcmFnZV9tb20xX3BubCA8LSBtYXRyaXgoTkEsIG5yb3cgPSAxMDAsIG5jb2wgPSAxMCkKYXZlcmFnZV9tb20yX3BubCA8LSBtYXRyaXgoTkEsIG5yb3cgPSAxMDAsIG5jb2wgPSAxMCkKCiMgTG9vcCB0aHJvdWdoIGVhY2ggc2ltdWxhdGlvbiAobikKZm9yIChuIGluIDE6MTApIHsKCiAgTU1fcG5sX3NldDMgPC0gc3Ryc3BsaXQoZ3N1YigiXFxbfFxcXSIsICIiLCB1bmxpc3QoYWdncmVnYXRlZF9yZXN1bHRzXzNbbiwgNl0pKSwgIiwgIikKCiAgU3RvY2hOb2lzeTFfcG5sX3NldDMgPC0gc3Ryc3BsaXQoZ3N1YigiXFxbfFxcXSIsICIiLCB1bmxpc3QoYWdncmVnYXRlZF9yZXN1bHRzXzNbbiwgOF0pKSwgIiwgIikKICAKICBTdG9jaE5vaXN5Ml9wbmxfc2V0MyA8LSBzdHJzcGxpdChnc3ViKCJcXFt8XFxdIiwgIiIsIHVubGlzdChhZ2dyZWdhdGVkX3Jlc3VsdHNfM1tuLCAxMF0pKSwgIiwgIikKICAKICBtcjFfcG5sX3NldDMgPC0gc3Ryc3BsaXQoZ3N1YigiXFxbfFxcXSIsICIiLCB1bmxpc3QoYWdncmVnYXRlZF9yZXN1bHRzXzNbbiwgMTJdKSksICIsICIpCiAgCiAgbXIyX3BubF9zZXQzIDwtIHN0cnNwbGl0KGdzdWIoIlxcW3xcXF0iLCAiIiwgdW5saXN0KGFnZ3JlZ2F0ZWRfcmVzdWx0c18zW24sIDE0XSkpLCAiLCAiKQogIAogIG1vbTFfcG5sX3NldDMgPC0gc3Ryc3BsaXQoZ3N1YigiXFxbfFxcXSIsICIiLCB1bmxpc3QoYWdncmVnYXRlZF9yZXN1bHRzXzNbbiwgMTZdKSksICIsICIpCiAgCiAgbW9tMl9wbmxfc2V0MyA8LSBzdHJzcGxpdChnc3ViKCJcXFt8XFxdIiwgIiIsIHVubGlzdChhZ2dyZWdhdGVkX3Jlc3VsdHNfM1tuLCAxOF0pKSwgIiwgIikKICAKICAjIExvb3AgdGhyb3VnaCBlYWNoIHBvc2l0aW9uIChpKQogIGZvciAoaSBpbiAxOjEwMCkgewogICAgIyBFeHRyYWN0IFRydWUgYW5kIEV4cGVjdGVkIHZhbHVlcyBmb3IgdGhlIGktdGggcG9zaXRpb24KICAgIE1NX3BubCA8LSBzYXBwbHkoTU1fcG5sX3NldDMsIGZ1bmN0aW9uKHgpIGFzLm51bWVyaWMoeFtpXSkpCiAgICBTdG9jaE5vaXN5MV9wbmwgPC0gc2FwcGx5KFN0b2NoTm9pc3kxX3BubF9zZXQzLCBmdW5jdGlvbih4KSBhcy5udW1lcmljKHhbaV0pKQogICAgU3RvY2hOb2lzeTJfcG5sIDwtIHNhcHBseShTdG9jaE5vaXN5Ml9wbmxfc2V0MywgZnVuY3Rpb24oeCkgYXMubnVtZXJpYyh4W2ldKSkKICAgIG1yMV9wbmwgPC0gc2FwcGx5KG1yMV9wbmxfc2V0MywgZnVuY3Rpb24oeCkgYXMubnVtZXJpYyh4W2ldKSkKICAgIG1yMl9wbmwgPC0gc2FwcGx5KG1yMl9wbmxfc2V0MywgZnVuY3Rpb24oeCkgYXMubnVtZXJpYyh4W2ldKSkKICAgIG1vbTFfcG5sIDwtIHNhcHBseShtb20xX3BubF9zZXQzLCBmdW5jdGlvbih4KSBhcy5udW1lcmljKHhbaV0pKQogICAgbW9tMl9wbmwgPC0gc2FwcGx5KG1vbTJfcG5sX3NldDMsIGZ1bmN0aW9uKHgpIGFzLm51bWVyaWMoeFtpXSkpCiAgICAKICAgICMgQ2FsY3VsYXRlIHRoZSBhdmVyYWdlIG9mIFRydWUgYW5kIEV4cGVjdGVkIHZhbHVlcyBmb3IgdGhlIGktdGggcG9zaXRpb24KICAgIGF2ZXJhZ2VfTU1fcG5sW2ksIG5dIDwtIG1lYW4oTU1fcG5sLCBuYS5ybSA9IFRSVUUpCiAgICBhdmVyYWdlX1N0b2NoTm9pc3kxX3BubFtpLCBuXSA8LSBtZWFuKFN0b2NoTm9pc3kxX3BubCwgbmEucm0gPSBUUlVFKQogICAgYXZlcmFnZV9TdG9jaE5vaXN5Ml9wbmxbaSwgbl0gPC0gbWVhbihTdG9jaE5vaXN5Ml9wbmwsIG5hLnJtID0gVFJVRSkKICAgIGF2ZXJhZ2VfbXIxX3BubFtpLCBuXSA8LSBtZWFuKG1yMV9wbmwsIG5hLnJtID0gVFJVRSkKICAgIGF2ZXJhZ2VfbXIyX3BubFtpLCBuXSA8LSBtZWFuKG1yMl9wbmwsIG5hLnJtID0gVFJVRSkKICAgIGF2ZXJhZ2VfbW9tMV9wbmxbaSwgbl0gPC0gbWVhbihtb20xX3BubCwgbmEucm0gPSBUUlVFKQogICAgYXZlcmFnZV9tb20yX3BubFtpLCBuXSA8LSBtZWFuKG1vbTJfcG5sLCBuYS5ybSA9IFRSVUUpCiAgfQp9CgojIENhbGN1bGF0ZSB0aGUgb3ZlcmFsbCBhdmVyYWdlIGZvciBlYWNoIHBvc2l0aW9uIGFjcm9zcyBhbGwgc2ltdWxhdGlvbnMKb3ZlcmFsbF9hdmVyYWdlX01NX3BubCA8LSByb3dNZWFucyhhdmVyYWdlX01NX3BubCwgbmEucm0gPSBUUlVFKQpvdmVyYWxsX2F2ZXJhZ2VfU3RvY2hOb2lzeTFfcG5sIDwtIHJvd01lYW5zKGF2ZXJhZ2VfU3RvY2hOb2lzeTFfcG5sLCBuYS5ybSA9IFRSVUUpCm92ZXJhbGxfYXZlcmFnZV9TdG9jaE5vaXN5Ml9wbmwgPC0gcm93TWVhbnMoYXZlcmFnZV9TdG9jaE5vaXN5Ml9wbmwsIG5hLnJtID0gVFJVRSkKb3ZlcmFsbF9hdmVyYWdlX21yMV9wbmwgPC0gcm93TWVhbnMoYXZlcmFnZV9tcjFfcG5sLCBuYS5ybSA9IFRSVUUpCm92ZXJhbGxfYXZlcmFnZV9tcjJfcG5sIDwtIHJvd01lYW5zKGF2ZXJhZ2VfbXIyX3BubCwgbmEucm0gPSBUUlVFKQpvdmVyYWxsX2F2ZXJhZ2VfbW9tMV9wbmwgPC0gcm93TWVhbnMoYXZlcmFnZV9tb20xX3BubCwgbmEucm0gPSBUUlVFKQpvdmVyYWxsX2F2ZXJhZ2VfbW9tMl9wbmwgPC0gcm93TWVhbnMoYXZlcmFnZV9tb20yX3BubCwgbmEucm0gPSBUUlVFKQoKIyBQbG90IHRoZSBvdmVyYWxsIGF2ZXJhZ2VzCnBsb3Qob3ZlcmFsbF9hdmVyYWdlX01NX3BubCwgdHlwZSA9ICJsIiwgcGNoID0gMTYsIGNvbCA9ICJibGFjayIsIG1haW4gPSAiT3ZlcmFsbCBBdmVyYWdlIFBOTCIsIHhsYWIgPSAiUG9zaXRpb24gaW4gTGlzdCIsIHlsYWIgPSAiVmFsdWUiLCB5bGltID0gYyhtaW4oYyhvdmVyYWxsX2F2ZXJhZ2VfTU1fcG5sLCBvdmVyYWxsX2F2ZXJhZ2VfU3RvY2hOb2lzeTFfcG5sLCBvdmVyYWxsX2F2ZXJhZ2VfU3RvY2hOb2lzeTJfcG5sLCBvdmVyYWxsX2F2ZXJhZ2VfbXIxX3BubCwgb3ZlcmFsbF9hdmVyYWdlX21yMl9wbmwsIG92ZXJhbGxfYXZlcmFnZV9tb20xX3BubCwgb3ZlcmFsbF9hdmVyYWdlX21vbTJfcG5sKSksIG1heChjKG92ZXJhbGxfYXZlcmFnZV9NTV9wbmwsIG92ZXJhbGxfYXZlcmFnZV9TdG9jaE5vaXN5MV9wbmwsIG92ZXJhbGxfYXZlcmFnZV9TdG9jaE5vaXN5Ml9wbmwsIG92ZXJhbGxfYXZlcmFnZV9tcjFfcG5sLCBvdmVyYWxsX2F2ZXJhZ2VfbXIyX3BubCwgb3ZlcmFsbF9hdmVyYWdlX21vbTFfcG5sLCBvdmVyYWxsX2F2ZXJhZ2VfbW9tMl9wbmwpKSkpCmxpbmVzKG92ZXJhbGxfYXZlcmFnZV9TdG9jaE5vaXN5MV9wbmwsIHR5cGUgPSAibCIsIHBjaCA9IDE2LCBjb2wgPSAicmVkIikKbGluZXMob3ZlcmFsbF9hdmVyYWdlX1N0b2NoTm9pc3kyX3BubCwgdHlwZSA9ICJsIiwgcGNoID0gMTYsIGNvbCA9ICJncmVlbiIpCmxpbmVzKG92ZXJhbGxfYXZlcmFnZV9tcjFfcG5sLCB0eXBlID0gImwiLCBwY2ggPSAxNiwgY29sID0gInllbGxvdyIpCmxpbmVzKG92ZXJhbGxfYXZlcmFnZV9tcjJfcG5sLCB0eXBlID0gImwiLCBwY2ggPSAxNiwgY29sID0gImJsdWUiKQpsaW5lcyhvdmVyYWxsX2F2ZXJhZ2VfbW9tMV9wbmwsIHR5cGUgPSAibCIsIHBjaCA9IDE2LCBjb2wgPSAicHVycGxlIikKbGluZXMob3ZlcmFsbF9hdmVyYWdlX21vbTJfcG5sLCB0eXBlID0gImwiLCBwY2ggPSAxNiwgY29sID0gIm9yYW5nZSIpCgojIEFkZCBsZWdlbmQKbGVnZW5kKCJ0b3BsZWZ0IiwgbGVnZW5kID0gYygiTWFya2V0IE1ha2VyIiwgIlN0b2NoYXN0aWMgTm9pc3kgMSIsICJTdG9jaGFzdGljIE5vaXN5IDIiLCAiTWVhbiBSZXZlcnNpb24gMSIsICJNZWFuIFJldmVyc2lvbiAyIiwgIk1vbWVudHVtIDEiLCAiTW9tZW50dW0gMiIpLCBjb2wgPSBjKCJibGFjayIsICJyZWQiLCAiZ3JlZW4iLCAieWVsbG93IiwgImJsdWUiLCAicHVycGxlIiwgIm9yYW5nZSIpLCBsdHkgPSAxLCBjZXggPSAwLjgpCmBgYAoKCmBgYHtyfQojIEluaXRpYWxpemUgbWF0cmljZXMgdG8gc3RvcmUgYXZlcmFnZXMgZm9yIGVhY2ggcG9zaXRpb24KYXZlcmFnZV9NTV9wb3MgPC0gbWF0cml4KE5BLCBucm93ID0gMTAwLCBuY29sID0gMTApCmF2ZXJhZ2VfU3RvY2hOb2lzeTFfcG9zIDwtIG1hdHJpeChOQSwgbnJvdyA9IDEwMCwgbmNvbCA9IDEwKQphdmVyYWdlX1N0b2NoTm9pc3kyX3BvcyA8LSBtYXRyaXgoTkEsIG5yb3cgPSAxMDAsIG5jb2wgPSAxMCkKYXZlcmFnZV9tcjFfcG9zIDwtIG1hdHJpeChOQSwgbnJvdyA9IDEwMCwgbmNvbCA9IDEwKQphdmVyYWdlX21yMl9wb3MgPC0gbWF0cml4KE5BLCBucm93ID0gMTAwLCBuY29sID0gMTApCmF2ZXJhZ2VfbW9tMV9wb3MgPC0gbWF0cml4KE5BLCBucm93ID0gMTAwLCBuY29sID0gMTApCmF2ZXJhZ2VfbW9tMl9wb3MgPC0gbWF0cml4KE5BLCBucm93ID0gMTAwLCBuY29sID0gMTApCgojIExvb3AgdGhyb3VnaCBlYWNoIHNpbXVsYXRpb24gKG4pCmZvciAobiBpbiAxOjEwKSB7CgogIE1NX3Bvc19zZXQzIDwtIHN0cnNwbGl0KGdzdWIoIlxcW3xcXF0iLCAiIiwgdW5saXN0KGFnZ3JlZ2F0ZWRfcmVzdWx0c18zW24sIDddKSksICIsICIpCgogIFN0b2NoTm9pc3kxX3Bvc19zZXQzIDwtIHN0cnNwbGl0KGdzdWIoIlxcW3xcXF0iLCAiIiwgdW5saXN0KGFnZ3JlZ2F0ZWRfcmVzdWx0c18zW24sIDldKSksICIsICIpCiAgCiAgU3RvY2hOb2lzeTJfcG9zX3NldDMgPC0gc3Ryc3BsaXQoZ3N1YigiXFxbfFxcXSIsICIiLCB1bmxpc3QoYWdncmVnYXRlZF9yZXN1bHRzXzNbbiwgMTFdKSksICIsICIpCiAgCiAgbXIxX3Bvc19zZXQzIDwtIHN0cnNwbGl0KGdzdWIoIlxcW3xcXF0iLCAiIiwgdW5saXN0KGFnZ3JlZ2F0ZWRfcmVzdWx0c18zW24sIDEyXSkpLCAiLCAiKQogIAogIG1yMl9wb3Nfc2V0MyA8LSBzdHJzcGxpdChnc3ViKCJcXFt8XFxdIiwgIiIsIHVubGlzdChhZ2dyZWdhdGVkX3Jlc3VsdHNfM1tuLCAxNV0pKSwgIiwgIikKICAKICBtb20xX3Bvc19zZXQzIDwtIHN0cnNwbGl0KGdzdWIoIlxcW3xcXF0iLCAiIiwgdW5saXN0KGFnZ3JlZ2F0ZWRfcmVzdWx0c18zW24sIDE3XSkpLCAiLCAiKQogIAogIG1vbTJfcG9zX3NldDMgPC0gc3Ryc3BsaXQoZ3N1YigiXFxbfFxcXSIsICIiLCB1bmxpc3QoYWdncmVnYXRlZF9yZXN1bHRzXzNbbiwgMTldKSksICIsICIpCiAgCiAgIyBMb29wIHRocm91Z2ggZWFjaCBwb3NpdGlvbiAoaSkKICBmb3IgKGkgaW4gMToxMDApIHsKICAgICMgRXh0cmFjdCBUcnVlIGFuZCBFeHBlY3RlZCB2YWx1ZXMgZm9yIHRoZSBpLXRoIHBvc2l0aW9uCiAgICBNTV9wb3MgPC0gc2FwcGx5KE1NX3Bvc19zZXQzLCBmdW5jdGlvbih4KSBhcy5udW1lcmljKHhbaV0pKQogICAgU3RvY2hOb2lzeTFfcG9zIDwtIHNhcHBseShTdG9jaE5vaXN5MV9wb3Nfc2V0MywgZnVuY3Rpb24oeCkgYXMubnVtZXJpYyh4W2ldKSkKICAgIFN0b2NoTm9pc3kyX3BvcyA8LSBzYXBwbHkoU3RvY2hOb2lzeTJfcG9zX3NldDMsIGZ1bmN0aW9uKHgpIGFzLm51bWVyaWMoeFtpXSkpCiAgICBtcjFfcG9zIDwtIHNhcHBseShtcjFfcG9zX3NldDMsIGZ1bmN0aW9uKHgpIGFzLm51bWVyaWMoeFtpXSkpCiAgICBtcjJfcG9zIDwtIHNhcHBseShtcjJfcG9zX3NldDMsIGZ1bmN0aW9uKHgpIGFzLm51bWVyaWMoeFtpXSkpCiAgICBtb20xX3BvcyA8LSBzYXBwbHkobW9tMV9wb3Nfc2V0MywgZnVuY3Rpb24oeCkgYXMubnVtZXJpYyh4W2ldKSkKICAgIG1vbTJfcG9zIDwtIHNhcHBseShtb20yX3Bvc19zZXQzLCBmdW5jdGlvbih4KSBhcy5udW1lcmljKHhbaV0pKQogICAgCiAgICAjIENhbGN1bGF0ZSB0aGUgYXZlcmFnZSBvZiBUcnVlIGFuZCBFeHBlY3RlZCB2YWx1ZXMgZm9yIHRoZSBpLXRoIHBvc2l0aW9uCiAgICBhdmVyYWdlX01NX3Bvc1tpLCBuXSA8LSBtZWFuKE1NX3BvcywgbmEucm0gPSBUUlVFKQogICAgYXZlcmFnZV9TdG9jaE5vaXN5MV9wb3NbaSwgbl0gPC0gbWVhbihTdG9jaE5vaXN5MV9wb3MsIG5hLnJtID0gVFJVRSkKICAgIGF2ZXJhZ2VfU3RvY2hOb2lzeTJfcG9zW2ksIG5dIDwtIG1lYW4oU3RvY2hOb2lzeTJfcG9zLCBuYS5ybSA9IFRSVUUpCiAgICBhdmVyYWdlX21yMV9wb3NbaSwgbl0gPC0gbWVhbihtcjFfcG9zLCBuYS5ybSA9IFRSVUUpCiAgICBhdmVyYWdlX21yMl9wb3NbaSwgbl0gPC0gbWVhbihtcjJfcG9zLCBuYS5ybSA9IFRSVUUpCiAgICBhdmVyYWdlX21vbTFfcG9zW2ksIG5dIDwtIG1lYW4obW9tMV9wb3MsIG5hLnJtID0gVFJVRSkKICAgIGF2ZXJhZ2VfbW9tMl9wb3NbaSwgbl0gPC0gbWVhbihtb20yX3BvcywgbmEucm0gPSBUUlVFKQogIH0KfQoKIyBDYWxjdWxhdGUgdGhlIG92ZXJhbGwgYXZlcmFnZSBmb3IgZWFjaCBwb3NpdGlvbiBhY3Jvc3MgYWxsIHNpbXVsYXRpb25zCm92ZXJhbGxfYXZlcmFnZV9NTV9wb3MgPC0gcm93TWVhbnMoYXZlcmFnZV9NTV9wb3MsIG5hLnJtID0gVFJVRSkKb3ZlcmFsbF9hdmVyYWdlX1N0b2NoTm9pc3kxX3BvcyA8LSByb3dNZWFucyhhdmVyYWdlX1N0b2NoTm9pc3kxX3BvcywgbmEucm0gPSBUUlVFKQpvdmVyYWxsX2F2ZXJhZ2VfU3RvY2hOb2lzeTJfcG9zIDwtIHJvd01lYW5zKGF2ZXJhZ2VfU3RvY2hOb2lzeTJfcG9zLCBuYS5ybSA9IFRSVUUpCm92ZXJhbGxfYXZlcmFnZV9tcjFfcG9zIDwtIHJvd01lYW5zKGF2ZXJhZ2VfbXIxX3BvcywgbmEucm0gPSBUUlVFKQpvdmVyYWxsX2F2ZXJhZ2VfbXIyX3BvcyA8LSByb3dNZWFucyhhdmVyYWdlX21yMl9wb3MsIG5hLnJtID0gVFJVRSkKb3ZlcmFsbF9hdmVyYWdlX21vbTFfcG9zIDwtIHJvd01lYW5zKGF2ZXJhZ2VfbW9tMV9wb3MsIG5hLnJtID0gVFJVRSkKb3ZlcmFsbF9hdmVyYWdlX21vbTJfcG9zIDwtIHJvd01lYW5zKGF2ZXJhZ2VfbW9tMl9wb3MsIG5hLnJtID0gVFJVRSkKCiMgUGxvdCB0aGUgb3ZlcmFsbCBhdmVyYWdlcwpwbG90KG92ZXJhbGxfYXZlcmFnZV9NTV9wb3MsIHR5cGUgPSAibCIsIHBjaCA9IDE2LCBjb2wgPSAiYmxhY2siLCBtYWluID0gIk92ZXJhbGwgQXZlcmFnZSBQb3NpdGlvbiIsIHhsYWIgPSAiUG9zaXRpb24gaW4gTGlzdCIsIHlsYWIgPSAiVmFsdWUiLCB5bGltID0gYyhtaW4oYyhvdmVyYWxsX2F2ZXJhZ2VfTU1fcG9zLCBvdmVyYWxsX2F2ZXJhZ2VfU3RvY2hOb2lzeTFfcG9zLCBvdmVyYWxsX2F2ZXJhZ2VfU3RvY2hOb2lzeTJfcG9zLCBvdmVyYWxsX2F2ZXJhZ2VfbXIxX3Bvcywgb3ZlcmFsbF9hdmVyYWdlX21yMl9wb3MsIG92ZXJhbGxfYXZlcmFnZV9tb20xX3Bvcywgb3ZlcmFsbF9hdmVyYWdlX21vbTJfcG9zKSksIG1heChjKG92ZXJhbGxfYXZlcmFnZV9NTV9wb3MsIG92ZXJhbGxfYXZlcmFnZV9TdG9jaE5vaXN5MV9wb3MsIG92ZXJhbGxfYXZlcmFnZV9TdG9jaE5vaXN5Ml9wb3MsIG92ZXJhbGxfYXZlcmFnZV9tcjFfcG9zLCBvdmVyYWxsX2F2ZXJhZ2VfbXIyX3Bvcywgb3ZlcmFsbF9hdmVyYWdlX21vbTFfcG9zLCBvdmVyYWxsX2F2ZXJhZ2VfbW9tMl9wb3MpKSkpCmxpbmVzKG92ZXJhbGxfYXZlcmFnZV9TdG9jaE5vaXN5MV9wb3MsIHR5cGUgPSAibCIsIHBjaCA9IDE2LCBjb2wgPSAicmVkIikKbGluZXMob3ZlcmFsbF9hdmVyYWdlX1N0b2NoTm9pc3kyX3BvcywgdHlwZSA9ICJsIiwgcGNoID0gMTYsIGNvbCA9ICJncmVlbiIpCmxpbmVzKG92ZXJhbGxfYXZlcmFnZV9tcjFfcG9zLCB0eXBlID0gImwiLCBwY2ggPSAxNiwgY29sID0gInllbGxvdyIpCmxpbmVzKG92ZXJhbGxfYXZlcmFnZV9tcjJfcG9zLCB0eXBlID0gImwiLCBwY2ggPSAxNiwgY29sID0gImJsdWUiKQpsaW5lcyhvdmVyYWxsX2F2ZXJhZ2VfbW9tMV9wb3MsIHR5cGUgPSAibCIsIHBjaCA9IDE2LCBjb2wgPSAicHVycGxlIikKbGluZXMob3ZlcmFsbF9hdmVyYWdlX21vbTJfcG9zLCB0eXBlID0gImwiLCBwY2ggPSAxNiwgY29sID0gIm9yYW5nZSIpCgojIEFkZCBsZWdlbmQKbGVnZW5kKCJ0b3BsZWZ0IiwgbGVnZW5kID0gYygiTWFya2V0IE1ha2VyIiwgIlN0b2NoYXN0aWMgTm9pc3kgMSIsICJTdG9jaGFzdGljIE5vaXN5IDIiLCAiTWVhbiBSZXZlcnNpb24gMSIsICJNZWFuIFJldmVyc2lvbiAyIiwgIk1vbWVudHVtIDEiLCAiTW9tZW50dW0gMiIpLCBjb2wgPSBjKCJibGFjayIsICJyZWQiLCAiZ3JlZW4iLCAieWVsbG93IiwgImJsdWUiLCAicHVycGxlIiwgIm9yYW5nZSIpLCBsdHkgPSAxLCBjZXggPSAwLjgpCmBgYAoKCgojIyBzZXQgNCAoMSBpbmZvcm1lZCArIDIgbm9pc3kgaW5mb3JtZWQgKyAyIG5vaXN5ICsgMSBzdG9jaGFzdGljIG5vaXN5KQoKYGBge3J9CiMgSW5pdGlhbGl6ZSBlbXB0eSB2ZWN0b3JzIHRvIHN0b3JlIHRydWUgYW5kIGV4cGVjdGVkIHZhbHVlcwpUcnVlVmFsdWVzX3NldDQgPC0gbnVtZXJpYygpCkV4cGVjdGVkVmFsdWVzX3NldDQgPC0gbnVtZXJpYygpCgojIExvb3AgdGhyb3VnaCBlYWNoIGl0ZXJhdGlvbiAobikKZm9yIChuIGluIDE6MTApIHsKICAjIEV4dHJhY3QgVHJ1ZSB2YWx1ZXMgZnJvbSB0aGUgYWdncmVnYXRlZF9yZXN1bHRzXzEgZGF0YWZyYW1lCiAgVHJ1ZVZhbHVlX3NldDQgPC0gc3Ryc3BsaXQoZ3N1YigiXFxbfFxcXSIsICIiLCB1bmxpc3QoYWdncmVnYXRlZF9yZXN1bHRzXzRbbiwgMl0pKSwgIiwgIilbWzFdXQogIAogICMgRXh0cmFjdCBFeHBlY3RlZCB2YWx1ZXMgZnJvbSB0aGUgYWdncmVnYXRlZF9yZXN1bHRzXzEgZGF0YWZyYW1lCiAgRXhwZWN0ZWRWYWx1ZV9zZXQ0IDwtIHN0cnNwbGl0KGdzdWIoIlxcW3xcXF0iLCAiIiwgdW5saXN0KGFnZ3JlZ2F0ZWRfcmVzdWx0c180W24sIDNdKSksICIsICIpW1sxXV0KICAKICAjIEFwcGVuZCB0aGUgVHJ1ZSBhbmQgRXhwZWN0ZWQgdmFsdWVzIHRvIHRoZWlyIHJlc3BlY3RpdmUgdmVjdG9ycwogIFRydWVWYWx1ZXNfc2V0NCA8LSBjKFRydWVWYWx1ZXNfc2V0NCwgYXMubnVtZXJpYyhUcnVlVmFsdWVfc2V0NCkpCiAgRXhwZWN0ZWRWYWx1ZXNfc2V0NCA8LSBjKEV4cGVjdGVkVmFsdWVzX3NldDQsIGFzLm51bWVyaWMoRXhwZWN0ZWRWYWx1ZV9zZXQ0KSkKfQoKIyBDYWxjdWxhdGUgdGhlIGF2ZXJhZ2Ugb2YgVHJ1ZSB2YWx1ZXMKYXZlcmFnZV90cnVlIDwtIG1lYW4oVHJ1ZVZhbHVlc19zZXQ0KQoKIyBDYWxjdWxhdGUgdGhlIGF2ZXJhZ2Ugb2YgRXhwZWN0ZWQgdmFsdWVzCmF2ZXJhZ2VfZXhwZWN0ZWQgPC0gbWVhbihFeHBlY3RlZFZhbHVlc19zZXQ0KQoKIyBQbG90IFRydWUgYW5kIEV4cGVjdGVkIHZhbHVlcyBvbiB0aGUgc2FtZSBwbG90CnBsb3QoVHJ1ZVZhbHVlc19zZXQ0LCB0eXBlID0gImwiLCBwY2ggPSAxNiwgY29sID0gImJsdWUiLCBtYWluID0gIlRydWUgdnMgRXhwZWN0ZWQgVmFsdWVzIGluIHNldCA0IiwgeGxhYiA9ICJJdGVyYXRpb24iLCB5bGFiID0gIlZhbHVlIikKbGluZXMoRXhwZWN0ZWRWYWx1ZXNfc2V0NCwgdHlwZSA9ICJsIiwgcGNoID0gMTYsIGNvbCA9ICJyZWQiKQoKIyBBZGQgbGVnZW5kCmxlZ2VuZCgidG9wcmlnaHQiLCBsZWdlbmQgPSBjKCJUcnVlIFZhbHVlcyIsICJFeHBlY3RlZCBWYWx1ZXMiKSwgY29sID0gYygiYmx1ZSIsICJyZWQiKSwgbHR5ID0gMSwgY2V4ID0gMC44KQoKIyBBZGQgaG9yaXpvbnRhbCBsaW5lcyBmb3IgdGhlIGF2ZXJhZ2VzCmFibGluZShoID0gYXZlcmFnZV90cnVlLCBjb2wgPSAiYmx1ZSIsIGx3ZCA9IDEpCmFibGluZShoID0gYXZlcmFnZV9leHBlY3RlZCwgY29sID0gInJlZCIsIGx3ZCA9IDEpCmBgYAoKYGBge3J9CiMgSW5pdGlhbGl6ZSBtYXRyaWNlcyB0byBzdG9yZSBhdmVyYWdlcyBmb3IgZWFjaCBwb3NpdGlvbgphdmVyYWdlX3RydWUgPC0gbWF0cml4KE5BLCBucm93ID0gMTAwLCBuY29sID0gMTApCmF2ZXJhZ2VfZXhwZWN0ZWQgPC0gbWF0cml4KE5BLCBucm93ID0gMTAwLCBuY29sID0gMTApCgojIExvb3AgdGhyb3VnaCBlYWNoIHNpbXVsYXRpb24gKG4pCmZvciAobiBpbiAxOjEwKSB7CiAgIyBFeHRyYWN0IFRydWUgdmFsdWVzIGZyb20gdGhlIGFnZ3JlZ2F0ZWRfcmVzdWx0c180IGRhdGFmcmFtZQogIFRydWVWYWx1ZXNfc2V0NCA8LSBzdHJzcGxpdChnc3ViKCJcXFt8XFxdIiwgIiIsIHVubGlzdChhZ2dyZWdhdGVkX3Jlc3VsdHNfNFtuLCAyXSkpLCAiLCAiKQogIAogICMgRXh0cmFjdCBFeHBlY3RlZCB2YWx1ZXMgZnJvbSB0aGUgYWdncmVnYXRlZF9yZXN1bHRzXzQgZGF0YWZyYW1lCiAgRXhwZWN0ZWRWYWx1ZXNfc2V0NCA8LSBzdHJzcGxpdChnc3ViKCJcXFt8XFxdIiwgIiIsIHVubGlzdChhZ2dyZWdhdGVkX3Jlc3VsdHNfNFtuLCAzXSkpLCAiLCAiKQogIAogICMgTG9vcCB0aHJvdWdoIGVhY2ggcG9zaXRpb24gKGkpCiAgZm9yIChpIGluIDE6MTAwKSB7CiAgICAjIEV4dHJhY3QgVHJ1ZSBhbmQgRXhwZWN0ZWQgdmFsdWVzIGZvciB0aGUgaS10aCBwb3NpdGlvbgogICAgVHJ1ZV92YWx1ZXMgPC0gc2FwcGx5KFRydWVWYWx1ZXNfc2V0NCwgZnVuY3Rpb24oeCkgYXMubnVtZXJpYyh4W2ldKSkKICAgIEV4cGVjdGVkX3ZhbHVlcyA8LSBzYXBwbHkoRXhwZWN0ZWRWYWx1ZXNfc2V0NCwgZnVuY3Rpb24oeCkgYXMubnVtZXJpYyh4W2ldKSkKICAgIAogICAgIyBDYWxjdWxhdGUgdGhlIGF2ZXJhZ2Ugb2YgVHJ1ZSBhbmQgRXhwZWN0ZWQgdmFsdWVzIGZvciB0aGUgaS10aCBwb3NpdGlvbgogICAgYXZlcmFnZV90cnVlW2ksIG5dIDwtIG1lYW4oVHJ1ZV92YWx1ZXMsIG5hLnJtID0gVFJVRSkKICAgIGF2ZXJhZ2VfZXhwZWN0ZWRbaSwgbl0gPC0gbWVhbihFeHBlY3RlZF92YWx1ZXMsIG5hLnJtID0gVFJVRSkKICB9Cn0KCiMgQ2FsY3VsYXRlIHRoZSBvdmVyYWxsIGF2ZXJhZ2UgZm9yIGVhY2ggcG9zaXRpb24gYWNyb3NzIGFsbCBzaW11bGF0aW9ucwpvdmVyYWxsX2F2ZXJhZ2VfdHJ1ZSA8LSByb3dNZWFucyhhdmVyYWdlX3RydWUsIG5hLnJtID0gVFJVRSkKb3ZlcmFsbF9hdmVyYWdlX2V4cGVjdGVkIDwtIHJvd01lYW5zKGF2ZXJhZ2VfZXhwZWN0ZWQsIG5hLnJtID0gVFJVRSkKCiMgUGxvdCB0aGUgb3ZlcmFsbCBhdmVyYWdlcwpwbG90KG92ZXJhbGxfYXZlcmFnZV90cnVlLCB0eXBlID0gImwiLCBwY2ggPSAxNiwgY29sID0gImJsdWUiLCBtYWluID0gIk92ZXJhbGwgQXZlcmFnZSBvZiBUcnVlIHZzIEV4cGVjdGVkIFZhbHVlcyIsIHhsYWIgPSAiUG9zaXRpb24gaW4gTGlzdCIsIHlsYWIgPSAiVmFsdWUiLCB5bGltID0gYyhtaW4oYyhvdmVyYWxsX2F2ZXJhZ2VfdHJ1ZSwgb3ZlcmFsbF9hdmVyYWdlX2V4cGVjdGVkKSksIG1heChjKG92ZXJhbGxfYXZlcmFnZV90cnVlLCBvdmVyYWxsX2F2ZXJhZ2VfZXhwZWN0ZWQpKSkpCmxpbmVzKG92ZXJhbGxfYXZlcmFnZV9leHBlY3RlZCwgdHlwZSA9ICJsIiwgcGNoID0gMTYsIGNvbCA9ICJyZWQiKQpsZWdlbmQoInRvcHJpZ2h0IiwgbGVnZW5kID0gYygiVHJ1ZSBWYWx1ZXMiLCAiRXhwZWN0ZWQgVmFsdWVzIiksIGNvbCA9IGMoImJsdWUiLCAicmVkIiksIGx0eSA9IDEsIGNleCA9IDAuOCkKCmBgYAoKCgoKYGBge3J9CiMgSW5pdGlhbGl6ZSBlbXB0eSB2ZWN0b3JzIHRvIHN0b3JlIHRoZSBCaWQgYW5kIEFzayB2YWx1ZXMKQmlkc19zZXQ0IDwtIG51bWVyaWMoKQpBc2tzX3NldDQgPC0gbnVtZXJpYygpCgojIExvb3AgdGhyb3VnaCBlYWNoIGl0ZXJhdGlvbiAobikKZm9yIChuIGluIDE6MTApIHsKICAjIEV4dHJhY3QgQmlkIHZhbHVlcyBmcm9tIHRoZSBhZ2dyZWdhdGVkX3Jlc3VsdHNfMSBkYXRhZnJhbWUKICBCaWRfc2V0NCA8LSBzdHJzcGxpdChnc3ViKCJcXFt8XFxdIiwgIiIsIHVubGlzdChhZ2dyZWdhdGVkX3Jlc3VsdHNfNFtuLCA0XSkpLCAiLCAiKVtbMV1dCiAgCiAgIyBFeHRyYWN0IEFzayB2YWx1ZXMgZnJvbSB0aGUgYWdncmVnYXRlZF9yZXN1bHRzXzEgZGF0YWZyYW1lIChuZXh0IGNvbHVtbikKICBBc2tfc2V0NCA8LSBzdHJzcGxpdChnc3ViKCJcXFt8XFxdIiwgIiIsIHVubGlzdChhZ2dyZWdhdGVkX3Jlc3VsdHNfNFtuLCA1XSkpLCAiLCAiKVtbMV1dCiAgCiAgIyBBcHBlbmQgdGhlIEJpZCBhbmQgQXNrIHZhbHVlcyB0byB0aGVpciByZXNwZWN0aXZlIHZlY3RvcnMKICBCaWRzX3NldDQgPC0gYyhCaWRzX3NldDQsIGFzLm51bWVyaWMoQmlkX3NldDQpKQogIEFza3Nfc2V0NCA8LSBjKEFza3Nfc2V0NCwgYXMubnVtZXJpYyhBc2tfc2V0NCkpCn0KCiMgQ2FsY3VsYXRlIHRoZSBhdmVyYWdlIG9mIEJpZCBhbmQgQXNrIHZhbHVlcwphdmVyYWdlX2JpZHMgPC0gbWVhbihCaWRzX3NldDQsIG5hLnJtID0gVFJVRSkKYXZlcmFnZV9hc2tzIDwtIG1lYW4oQXNrc19zZXQ0LCBuYS5ybSA9IFRSVUUpCgojIFBsb3QgdGhlIEJpZCBhbmQgQXNrIHZhbHVlcyBvbiB0aGUgc2FtZSBwbG90CnBsb3QoQmlkc19zZXQ0LCB0eXBlID0gImwiLCBwY2ggPSAxNiwgY29sID0gImJsdWUiLCBtYWluID0gIkJpZHMgdnMgQXNrcyBpbiBzZXQgNCIsIHhsYWIgPSAiSXRlcmF0aW9uIiwgeWxhYiA9ICJWYWx1ZSIsIHlsaW0gPSBjKG1pbihjKEJpZHNfc2V0NCwgQXNrc19zZXQ0KSksIG1heChjKEJpZHNfc2V0NCwgQXNrc19zZXQ0KSkpKQpsaW5lcyhBc2tzX3NldDQsIHR5cGUgPSAibCIsIHBjaCA9IDE2LCBjb2wgPSAicmVkIikKCiMgQWRkIGxlZ2VuZApsZWdlbmQoInRvcHJpZ2h0IiwgbGVnZW5kID0gYygiQmlkcyIsICJBc2tzIiksIGNvbCA9IGMoImJsdWUiLCAicmVkIiksIGx0eSA9IDEsIGNleCA9IDAuOCkKCiMgQWRkIGhvcml6b250YWwgbGluZXMgZm9yIHRoZSBhdmVyYWdlcwphYmxpbmUoaCA9IGF2ZXJhZ2VfYmlkcywgY29sID0gImJsdWUiLCBsdHkgPSAxKQphYmxpbmUoaCA9IGF2ZXJhZ2VfYXNrcywgY29sID0gInJlZCIsIGx0eSA9IDEpCmBgYAoKCmBgYHtyfQojIEluaXRpYWxpemUgbWF0cmljZXMgdG8gc3RvcmUgYXZlcmFnZXMgZm9yIGVhY2ggcG9zaXRpb24KYXZlcmFnZV9iaWQgPC0gbWF0cml4KE5BLCBucm93ID0gMTAwLCBuY29sID0gMTApCmF2ZXJhZ2VfYXNrIDwtIG1hdHJpeChOQSwgbnJvdyA9IDEwMCwgbmNvbCA9IDEwKQoKIyBMb29wIHRocm91Z2ggZWFjaCBzaW11bGF0aW9uIChuKQpmb3IgKG4gaW4gMToxMCkgewogICMgRXh0cmFjdCBUcnVlIHZhbHVlcyBmcm9tIHRoZSBhZ2dyZWdhdGVkX3Jlc3VsdHNfNCBkYXRhZnJhbWUKICBCaWRzX3NldDQgPC0gc3Ryc3BsaXQoZ3N1YigiXFxbfFxcXSIsICIiLCB1bmxpc3QoYWdncmVnYXRlZF9yZXN1bHRzXzRbbiwgNF0pKSwgIiwgIikKICAKICAjIEV4dHJhY3QgRXhwZWN0ZWQgdmFsdWVzIGZyb20gdGhlIGFnZ3JlZ2F0ZWRfcmVzdWx0c180IGRhdGFmcmFtZQogIEFza3Nfc2V0NCA8LSBzdHJzcGxpdChnc3ViKCJcXFt8XFxdIiwgIiIsIHVubGlzdChhZ2dyZWdhdGVkX3Jlc3VsdHNfNFtuLCA1XSkpLCAiLCAiKQogIAogICMgTG9vcCB0aHJvdWdoIGVhY2ggcG9zaXRpb24gKGkpCiAgZm9yIChpIGluIDE6MTAwKSB7CiAgICAjIEV4dHJhY3QgVHJ1ZSBhbmQgRXhwZWN0ZWQgdmFsdWVzIGZvciB0aGUgaS10aCBwb3NpdGlvbgogICAgQmlkcyA8LSBzYXBwbHkoQmlkc19zZXQ0LCBmdW5jdGlvbih4KSBhcy5udW1lcmljKHhbaV0pKQogICAgQXNrcyA8LSBzYXBwbHkoQXNrc19zZXQ0LCBmdW5jdGlvbih4KSBhcy5udW1lcmljKHhbaV0pKQogICAgCiAgICAjIENhbGN1bGF0ZSB0aGUgYXZlcmFnZSBvZiBUcnVlIGFuZCBFeHBlY3RlZCB2YWx1ZXMgZm9yIHRoZSBpLXRoIHBvc2l0aW9uCiAgICBhdmVyYWdlX2JpZFtpLCBuXSA8LSBtZWFuKEJpZHMsIG5hLnJtID0gVFJVRSkKICAgIGF2ZXJhZ2VfYXNrW2ksIG5dIDwtIG1lYW4oQXNrcywgbmEucm0gPSBUUlVFKQogIH0KfQoKIyBDYWxjdWxhdGUgdGhlIG92ZXJhbGwgYXZlcmFnZSBmb3IgZWFjaCBwb3NpdGlvbiBhY3Jvc3MgYWxsIHNpbXVsYXRpb25zCm92ZXJhbGxfYXZlcmFnZV9iaWQgPC0gcm93TWVhbnMoYXZlcmFnZV9iaWQsIG5hLnJtID0gVFJVRSkKb3ZlcmFsbF9hdmVyYWdlX2FzayA8LSByb3dNZWFucyhhdmVyYWdlX2FzaywgbmEucm0gPSBUUlVFKQoKIyBQbG90IHRoZSBvdmVyYWxsIGF2ZXJhZ2VzCnBsb3Qob3ZlcmFsbF9hdmVyYWdlX2JpZCwgdHlwZSA9ICJsIiwgcGNoID0gMTYsIGNvbCA9ICJibHVlIiwgbWFpbiA9ICJPdmVyYWxsIEF2ZXJhZ2Ugb2YgQmlkcyB2cyBBc2tzIiwgeGxhYiA9ICJQb3NpdGlvbiBpbiBMaXN0IiwgeWxhYiA9ICJWYWx1ZSIsIHlsaW0gPSBjKG1pbihjKG92ZXJhbGxfYXZlcmFnZV9iaWQsIG92ZXJhbGxfYXZlcmFnZV9hc2spKSwgbWF4KGMob3ZlcmFsbF9hdmVyYWdlX2JpZCwgb3ZlcmFsbF9hdmVyYWdlX2FzaykpKSkKbGluZXMob3ZlcmFsbF9hdmVyYWdlX2FzaywgdHlwZSA9ICJsIiwgcGNoID0gMTYsIGNvbCA9ICJyZWQiKQpsZWdlbmQoInRvcHJpZ2h0IiwgbGVnZW5kID0gYygiQmlkcyIsICJBc2tzIiksIGNvbCA9IGMoImJsdWUiLCAicmVkIiksIGx0eSA9IDEsIGNleCA9IDAuOCkKYGBgCgpgYGB7cn0KIyBJbml0aWFsaXplIG1hdHJpY2VzIHRvIHN0b3JlIGF2ZXJhZ2VzIGZvciBlYWNoIHBvc2l0aW9uCmF2ZXJhZ2VfYmlkIDwtIG1hdHJpeChOQSwgbnJvdyA9IDEwMCwgbmNvbCA9IDEwKQphdmVyYWdlX2FzayA8LSBtYXRyaXgoTkEsIG5yb3cgPSAxMDAsIG5jb2wgPSAxMCkKCiMgTG9vcCB0aHJvdWdoIGVhY2ggc2ltdWxhdGlvbiAobikKZm9yIChuIGluIDE6MTApIHsKICAjIEV4dHJhY3QgVHJ1ZSB2YWx1ZXMgZnJvbSB0aGUgYWdncmVnYXRlZF9yZXN1bHRzXzQgZGF0YWZyYW1lCiAgQmlkc19zZXQ0IDwtIHN0cnNwbGl0KGdzdWIoIlxcW3xcXF0iLCAiIiwgdW5saXN0KGFnZ3JlZ2F0ZWRfcmVzdWx0c180W24sIDRdKSksICIsICIpCiAgCiAgIyBFeHRyYWN0IEV4cGVjdGVkIHZhbHVlcyBmcm9tIHRoZSBhZ2dyZWdhdGVkX3Jlc3VsdHNfNCBkYXRhZnJhbWUKICBBc2tzX3NldDQgPC0gc3Ryc3BsaXQoZ3N1YigiXFxbfFxcXSIsICIiLCB1bmxpc3QoYWdncmVnYXRlZF9yZXN1bHRzXzRbbiwgNV0pKSwgIiwgIikKICAKICAjIExvb3AgdGhyb3VnaCBlYWNoIHBvc2l0aW9uIChpKQogIGZvciAoaSBpbiAxOjEwMCkgewogICAgIyBFeHRyYWN0IFRydWUgYW5kIEV4cGVjdGVkIHZhbHVlcyBmb3IgdGhlIGktdGggcG9zaXRpb24KICAgIEJpZHMgPC0gc2FwcGx5KEJpZHNfc2V0NCwgZnVuY3Rpb24oeCkgYXMubnVtZXJpYyh4W2ldKSkKICAgIEFza3MgPC0gc2FwcGx5KEFza3Nfc2V0NCwgZnVuY3Rpb24oeCkgYXMubnVtZXJpYyh4W2ldKSkKICAgIAogICAgIyBDYWxjdWxhdGUgdGhlIGF2ZXJhZ2Ugb2YgVHJ1ZSBhbmQgRXhwZWN0ZWQgdmFsdWVzIGZvciB0aGUgaS10aCBwb3NpdGlvbgogICAgYXZlcmFnZV9iaWRbaSwgbl0gPC0gbWVhbihCaWRzLCBuYS5ybSA9IFRSVUUpCiAgICBhdmVyYWdlX2Fza1tpLCBuXSA8LSBtZWFuKEFza3MsIG5hLnJtID0gVFJVRSkKICB9Cn0KCiMgQ2FsY3VsYXRlIHRoZSBvdmVyYWxsIGF2ZXJhZ2UgZm9yIGVhY2ggcG9zaXRpb24gYWNyb3NzIGFsbCBzaW11bGF0aW9ucwpvdmVyYWxsX2F2ZXJhZ2VfYmlkIDwtIHJvd01lYW5zKGF2ZXJhZ2VfYmlkLCBuYS5ybSA9IFRSVUUpCm92ZXJhbGxfYXZlcmFnZV9hc2sgPC0gcm93TWVhbnMoYXZlcmFnZV9hc2ssIG5hLnJtID0gVFJVRSkKCiMjIFRydWUgVmFsdWUKIyBJbml0aWFsaXplIG1hdHJpY2VzIHRvIHN0b3JlIGF2ZXJhZ2VzIGZvciBlYWNoIHBvc2l0aW9uCmF2ZXJhZ2VfdHJ1ZSA8LSBtYXRyaXgoTkEsIG5yb3cgPSAxMDAsIG5jb2wgPSAxMCkKYXZlcmFnZV9leHBlY3RlZCA8LSBtYXRyaXgoTkEsIG5yb3cgPSAxMDAsIG5jb2wgPSAxMCkKCiMgTG9vcCB0aHJvdWdoIGVhY2ggc2ltdWxhdGlvbiAobikKZm9yIChuIGluIDE6MTApIHsKICAjIEV4dHJhY3QgVHJ1ZSB2YWx1ZXMgZnJvbSB0aGUgYWdncmVnYXRlZF9yZXN1bHRzXzQgZGF0YWZyYW1lCiAgVHJ1ZVZhbHVlc19zZXQ0IDwtIHN0cnNwbGl0KGdzdWIoIlxcW3xcXF0iLCAiIiwgdW5saXN0KGFnZ3JlZ2F0ZWRfcmVzdWx0c180W24sIDJdKSksICIsICIpCiAgCiAgIyBFeHRyYWN0IEV4cGVjdGVkIHZhbHVlcyBmcm9tIHRoZSBhZ2dyZWdhdGVkX3Jlc3VsdHNfNCBkYXRhZnJhbWUKICBFeHBlY3RlZFZhbHVlc19zZXQ0IDwtIHN0cnNwbGl0KGdzdWIoIlxcW3xcXF0iLCAiIiwgdW5saXN0KGFnZ3JlZ2F0ZWRfcmVzdWx0c180W24sIDNdKSksICIsICIpCiAgCiAgIyBMb29wIHRocm91Z2ggZWFjaCBwb3NpdGlvbiAoaSkKICBmb3IgKGkgaW4gMToxMDApIHsKICAgICMgRXh0cmFjdCBUcnVlIGFuZCBFeHBlY3RlZCB2YWx1ZXMgZm9yIHRoZSBpLXRoIHBvc2l0aW9uCiAgICBUcnVlX3ZhbHVlcyA8LSBzYXBwbHkoVHJ1ZVZhbHVlc19zZXQ0LCBmdW5jdGlvbih4KSBhcy5udW1lcmljKHhbaV0pKQogICAgRXhwZWN0ZWRfdmFsdWVzIDwtIHNhcHBseShFeHBlY3RlZFZhbHVlc19zZXQ0LCBmdW5jdGlvbih4KSBhcy5udW1lcmljKHhbaV0pKQogICAgCiAgICAjIENhbGN1bGF0ZSB0aGUgYXZlcmFnZSBvZiBUcnVlIGFuZCBFeHBlY3RlZCB2YWx1ZXMgZm9yIHRoZSBpLXRoIHBvc2l0aW9uCiAgICBhdmVyYWdlX3RydWVbaSwgbl0gPC0gbWVhbihUcnVlX3ZhbHVlcywgbmEucm0gPSBUUlVFKQogICAgYXZlcmFnZV9leHBlY3RlZFtpLCBuXSA8LSBtZWFuKEV4cGVjdGVkX3ZhbHVlcywgbmEucm0gPSBUUlVFKQogIH0KfQoKIyBDYWxjdWxhdGUgdGhlIG92ZXJhbGwgYXZlcmFnZSBmb3IgZWFjaCBwb3NpdGlvbiBhY3Jvc3MgYWxsIHNpbXVsYXRpb25zCm92ZXJhbGxfYXZlcmFnZV90cnVlIDwtIHJvd01lYW5zKGF2ZXJhZ2VfdHJ1ZSwgbmEucm0gPSBUUlVFKQpvdmVyYWxsX2F2ZXJhZ2VfZXhwZWN0ZWQgPC0gcm93TWVhbnMoYXZlcmFnZV9leHBlY3RlZCwgbmEucm0gPSBUUlVFKQoKIyBQbG90IHRoZSBvdmVyYWxsIGF2ZXJhZ2VzCiNwbG90KG92ZXJhbGxfYXZlcmFnZV90cnVlLCB0eXBlID0gImwiLCBwY2ggPSAxNiwgY29sID0gImJsdWUiLCBtYWluID0gIk92ZXJhbGwgQXZlcmFnZSBvZiBUcnVlIHZzIEV4cGVjdGVkIFZhbHVlcyIsIHhsYWIgPSAiUG9zaXRpb24gaW4gTGlzdCIsIHlsYWIgPSAiVmFsdWUiLCB5bGltID0gYyhtaW4oYyhvdmVyYWxsX2F2ZXJhZ2VfdHJ1ZSwgb3ZlcmFsbF9hdmVyYWdlX2V4cGVjdGVkKSksIG1heChjKG92ZXJhbGxfYXZlcmFnZV90cnVlLCBvdmVyYWxsX2F2ZXJhZ2VfZXhwZWN0ZWQpKSkpCiNsaW5lcyhvdmVyYWxsX2F2ZXJhZ2VfZXhwZWN0ZWQsIHR5cGUgPSAibCIsIHBjaCA9IDE2LCBjb2wgPSAicmVkIikKI2xlZ2VuZCgidG9wcmlnaHQiLCBsZWdlbmQgPSBjKCJUcnVlIFZhbHVlcyIsICJFeHBlY3RlZCBWYWx1ZXMiKSwgY29sID0gYygiYmx1ZSIsICJyZWQiKSwgbHR5ID0gMSwgY2V4ID0gMC44KQoKIyBQbG90IHRoZSBvdmVyYWxsIGF2ZXJhZ2VzCnBsb3Qob3ZlcmFsbF9hdmVyYWdlX2JpZCwgdHlwZSA9ICJsIiwgcGNoID0gMTYsIGNvbCA9ICJibHVlIiwgbWFpbiA9ICJPdmVyYWxsIEF2ZXJhZ2Ugb2YgQmlkcyB2cyBBc2tzICYgVHJ1ZSB2cyBFeHBlY3RlZCBWYWx1ZXMiLCB4bGFiID0gIlBvc2l0aW9uIGluIExpc3QiLCB5bGFiID0gIlZhbHVlIiwgeWxpbSA9IGMobWluKGMob3ZlcmFsbF9hdmVyYWdlX2JpZCwgb3ZlcmFsbF9hdmVyYWdlX2Fzaywgb3ZlcmFsbF9hdmVyYWdlX3RydWUsIG92ZXJhbGxfYXZlcmFnZV9leHBlY3RlZCkpLCBtYXgoYyhvdmVyYWxsX2F2ZXJhZ2VfYmlkLCBvdmVyYWxsX2F2ZXJhZ2VfYXNrLCBvdmVyYWxsX2F2ZXJhZ2VfdHJ1ZSwgb3ZlcmFsbF9hdmVyYWdlX2V4cGVjdGVkKSkpKQpsaW5lcyhvdmVyYWxsX2F2ZXJhZ2VfYXNrLCB0eXBlID0gImwiLCBwY2ggPSAxNiwgY29sID0gInJlZCIpCmxpbmVzKG92ZXJhbGxfYXZlcmFnZV90cnVlLCB0eXBlID0gImwiLCBwY2ggPSAxNiwgY29sID0gImdyZWVuIikKbGluZXMob3ZlcmFsbF9hdmVyYWdlX2V4cGVjdGVkLCB0eXBlID0gImwiLCBwY2ggPSAxNiwgY29sID0gInB1cnBsZSIpCmxlZ2VuZCgiYm90dG9tbGVmdCIsIGxlZ2VuZCA9IGMoIkJpZHMiLCAiQXNrcyIsICJUcnVlIFZhbHVlIiwgIkV4cGVjdGVkIFZhbHVlIiksIGNvbCA9IGMoImJsdWUiLCAicmVkIiwgImdyZWVuIiwgInB1cnBsZSIpLCBsdHkgPSAxLCBjZXggPSAwLjgpCmBgYAoKCgpgYGB7cn0KIyBJbml0aWFsaXplIGVtcHR5IHZlY3RvcnMgdG8gc3RvcmUgdGhlIEJpZCBhbmQgQXNrIHZhbHVlcwpNTV9wbmxfc2V0NCA8LSBudW1lcmljKCkKSW5mb3JtZWRfcG5sX3NldDQgPC0gbnVtZXJpYygpCk5vaXN5SW5mb3JtZWQxX3BubF9zZXQ0IDwtIG51bWVyaWMoKQpOb2lzeUluZm9ybWVkMl9wbmxfc2V0NCA8LSBudW1lcmljKCkKTm9pc3kxX3BubF9zZXQ0IDwtIG51bWVyaWMoKQpOb2lzeTJfcG5sX3NldDQgPC0gbnVtZXJpYygpClN0b2NoTm9pc3lfcG5sX3NldDQgPC0gbnVtZXJpYygpCgojIExvb3AgdGhyb3VnaCBlYWNoIGl0ZXJhdGlvbiAobikKZm9yIChuIGluIDE6MTApIHsKCiAgTU1fcG5sX3ZhbHVlcyA8LSBzdHJzcGxpdChnc3ViKCJcXFt8XFxdIiwgIiIsIHVubGlzdChhZ2dyZWdhdGVkX3Jlc3VsdHNfNFtuLCA2XSkpLCAiLCAiKVtbMV1dCiAgCiAgSW5mb3JtZWRfcG5sX3ZhbHVlcyA8LSBzdHJzcGxpdChnc3ViKCJcXFt8XFxdIiwgIiIsIHVubGlzdChhZ2dyZWdhdGVkX3Jlc3VsdHNfNFtuLCA4XSkpLCAiLCAiKVtbMV1dCiAgCiAgTm9pc3lJbmZvcm1lZDFfcG5sX3ZhbHVlcyA8LSBzdHJzcGxpdChnc3ViKCJcXFt8XFxdIiwgIiIsIHVubGlzdChhZ2dyZWdhdGVkX3Jlc3VsdHNfNFtuLCAxMF0pKSwgIiwgIilbWzFdXQogIAogIE5vaXN5SW5mb3JtZWQyX3BubF92YWx1ZXMgPC0gc3Ryc3BsaXQoZ3N1YigiXFxbfFxcXSIsICIiLCB1bmxpc3QoYWdncmVnYXRlZF9yZXN1bHRzXzRbbiwgMTJdKSksICIsICIpW1sxXV0KICAKICBOb2lzeTFfcG5sX3ZhbHVlcyA8LSBzdHJzcGxpdChnc3ViKCJcXFt8XFxdIiwgIiIsIHVubGlzdChhZ2dyZWdhdGVkX3Jlc3VsdHNfNFtuLCAxNF0pKSwgIiwgIilbWzFdXQogIAogIE5vaXN5Ml9wbmxfdmFsdWVzIDwtIHN0cnNwbGl0KGdzdWIoIlxcW3xcXF0iLCAiIiwgdW5saXN0KGFnZ3JlZ2F0ZWRfcmVzdWx0c180W24sIDE2XSkpLCAiLCAiKVtbMV1dCiAgCiAgU3RvY2hOb2lzeV9wbmxfdmFsdWVzIDwtIHN0cnNwbGl0KGdzdWIoIlxcW3xcXF0iLCAiIiwgdW5saXN0KGFnZ3JlZ2F0ZWRfcmVzdWx0c180W24sIDE4XSkpLCAiLCAiKVtbMV1dCiAgCiAgIyBDb252ZXJ0IEJpZCBhbmQgQXNrIHZhbHVlcyB0byBudW1lcmljIGFuZCBhcHBlbmQgdG8gdGhlIHZlY3RvcnMKICBNTV9wbmxfc2V0NCA8LSBjKE1NX3BubF9zZXQ0LCBhcy5udW1lcmljKE1NX3BubF92YWx1ZXMpKQogIEluZm9ybWVkX3BubF9zZXQ0IDwtIGMoSW5mb3JtZWRfcG5sX3NldDQsIGFzLm51bWVyaWMoSW5mb3JtZWRfcG5sX3ZhbHVlcykpCiAgTm9pc3lJbmZvcm1lZDFfcG5sX3NldDQgPC0gYyhOb2lzeUluZm9ybWVkMV9wbmxfc2V0NCwgYXMubnVtZXJpYyhOb2lzeUluZm9ybWVkMV9wbmxfdmFsdWVzKSkKICBOb2lzeUluZm9ybWVkMl9wbmxfc2V0NCA8LSBjKE5vaXN5SW5mb3JtZWQyX3BubF9zZXQ0LCBhcy5udW1lcmljKE5vaXN5SW5mb3JtZWQyX3BubF92YWx1ZXMpKQogIE5vaXN5MV9wbmxfc2V0NCA8LSBjKE5vaXN5X3BubF9zZXQ0LCBhcy5udW1lcmljKE5vaXN5MV9wbmxfdmFsdWVzKSkKICBOb2lzeTJfcG5sX3NldDQgPC0gYyhOb2lzeTJfcG5sX3NldDQsIGFzLm51bWVyaWMoTm9pc3kyX3BubF92YWx1ZXMpKQogIFN0b2NoTm9pc3lfcG5sX3NldDQgPC0gYyhTdG9jaE5vaXN5X3BubF9zZXQ0LCBhcy5udW1lcmljKFN0b2NoTm9pc3lfcG5sX3ZhbHVlcykpCn0KCiMgQ2FsY3VsYXRlIHRoZSBhdmVyYWdlIG9mIEJpZCBhbmQgQXNrIHZhbHVlcwojYXZlcmFnZV9NTSA8LSBtZWFuKE1NX3NldDQsIG5hLnJtID0gVFJVRSkKI2F2ZXJhZ2VfSU4gPC0gbWVhbihJTl9zZXQ0LCBuYS5ybSA9IFRSVUUpCgojIFBsb3QgdGhlIEJpZCBhbmQgQXNrIHZhbHVlcyBvbiB0aGUgc2FtZSBwbG90CnBsb3QoTU1fcG5sX3NldDQsIHR5cGUgPSAibCIsIHBjaCA9IDE2LCBjb2wgPSAiYmxhY2siLCBtYWluID0gIlBOTCBpbiBzZXQgNCIsIHhsYWIgPSAiSXRlcmF0aW9uIiwgeWxhYiA9ICJWYWx1ZSIsIHlsaW0gPSBjKG1pbihjKE1NX3BubF9zZXQ0LCBJbmZvcm1lZF9wbmxfc2V0NCwgTm9pc3lJbmZvcm1lZDFfcG5sX3NldDQsIE5vaXN5SW5mb3JtZWQyX3BubF9zZXQ0LCBOb2lzeTFfcG5sX3NldDQsIE5vaXN5Ml9wbmxfc2V0NCwgU3RvY2hOb2lzeV9wbmxfc2V0NCkpLCBtYXgoYyhNTV9wbmxfc2V0NCwgSW5mb3JtZWRfcG5sX3NldDQsIE5vaXN5SW5mb3JtZWQxX3BubF9zZXQ0LCBOb2lzeUluZm9ybWVkMl9wbmxfc2V0NCwgTm9pc3kxX3BubF9zZXQ0LCBOb2lzeTJfcG5sX3NldDQsIFN0b2NoTm9pc3lfcG5sX3NldDQpKSkpCmxpbmVzKEluZm9ybWVkX3BubF9zZXQ0LCB0eXBlID0gImwiLCBwY2ggPSAxNiwgY29sID0gInJlZCIpCmxpbmVzKE5vaXN5SW5mb3JtZWQxX3BubF9zZXQ0LCB0eXBlID0gImwiLCBwY2ggPSAxNiwgY29sID0gImdyZWVuIikKbGluZXMoTm9pc3lJbmZvcm1lZDJfcG5sX3NldDQsIHR5cGUgPSAibCIsIHBjaCA9IDE2LCBjb2wgPSAieWVsbG93IikKbGluZXMoTm9pc3kxX3BubF9zZXQ0LCB0eXBlID0gImwiLCBwY2ggPSAxNiwgY29sID0gImJsdWUiKQpsaW5lcyhOb2lzeTJfcG5sX3NldDQsIHR5cGUgPSAibCIsIHBjaCA9IDE2LCBjb2wgPSAicHVycGxlIikKbGluZXMoU3RvY2hOb2lzeV9wbmxfc2V0NCwgdHlwZSA9ICJsIiwgcGNoID0gMTYsIGNvbCA9ICJvcmFuZ2UiKQoKCiMgQWRkIGxlZ2VuZApsZWdlbmQoImJvdHRvbXJpZ2h0IiwgbGVnZW5kID0gYygiTWFya2V0IE1ha2VyIiwgIkluZm9ybWVkIiwgIk5vaXN5IEluZm9ybWVkIDEiLCAiTm9pc3kgSW5mb3JtZWQgMiIsICJOb2lzeSAxIiwgIk5vaXN5IDIiLCAiU3RvY2hhc3RpYyBOb2lzeSIpLCBjb2wgPSBjKCJibGFjayIsICJyZWQiLCAiZ3JlZW4iLCAieWVsbG93IiwgImJsdWUiLCAicHVycGxlIiwgIm9yYW5nZSIpLCBsdHkgPSAxLCBjZXggPSAwLjgpCgojIEFkZCBob3Jpem9udGFsIGxpbmVzIGZvciB0aGUgYXZlcmFnZXMKI2FibGluZShoID0gYXZlcmFnZV9NTSwgY29sID0gImJsdWUiLCBsdHkgPSAxKQojYWJsaW5lKGggPSBhdmVyYWdlX0lOLCBjb2wgPSAicmVkIiwgbHR5ID0gMSkKCmBgYAoKYGBge3J9CiMgSW5pdGlhbGl6ZSBtYXRyaWNlcyB0byBzdG9yZSBhdmVyYWdlcyBmb3IgZWFjaCBwb3NpdGlvbgphdmVyYWdlX01NX3BubCA8LSBtYXRyaXgoTkEsIG5yb3cgPSAxMDAsIG5jb2wgPSAxMCkKYXZlcmFnZV9JbmZvcm1lZF9wbmwgPC0gbWF0cml4KE5BLCBucm93ID0gMTAwLCBuY29sID0gMTApCmF2ZXJhZ2VfTm9pc3lJbmZvcm1lZDFfcG5sIDwtIG1hdHJpeChOQSwgbnJvdyA9IDEwMCwgbmNvbCA9IDEwKQphdmVyYWdlX05vaXN5SW5mb3JtZWQyX3BubCA8LSBtYXRyaXgoTkEsIG5yb3cgPSAxMDAsIG5jb2wgPSAxMCkKYXZlcmFnZV9Ob2lzeTFfcG5sIDwtIG1hdHJpeChOQSwgbnJvdyA9IDEwMCwgbmNvbCA9IDEwKQphdmVyYWdlX05vaXN5Ml9wbmwgPC0gbWF0cml4KE5BLCBucm93ID0gMTAwLCBuY29sID0gMTApCmF2ZXJhZ2VfU3RvY2hOb2lzeV9wbmwgPC0gbWF0cml4KE5BLCBucm93ID0gMTAwLCBuY29sID0gMTApCgojIExvb3AgdGhyb3VnaCBlYWNoIHNpbXVsYXRpb24gKG4pCmZvciAobiBpbiAxOjEwKSB7CgogIE1NX3BubF9zZXQ0IDwtIHN0cnNwbGl0KGdzdWIoIlxcW3xcXF0iLCAiIiwgdW5saXN0KGFnZ3JlZ2F0ZWRfcmVzdWx0c180W24sIDZdKSksICIsICIpCgogIEluZm9ybWVkX3BubF9zZXQ0IDwtIHN0cnNwbGl0KGdzdWIoIlxcW3xcXF0iLCAiIiwgdW5saXN0KGFnZ3JlZ2F0ZWRfcmVzdWx0c180W24sIDhdKSksICIsICIpCiAgCiAgTm9pc3lJbmZvcm1lZDFfcG5sX3NldDQgPC0gc3Ryc3BsaXQoZ3N1YigiXFxbfFxcXSIsICIiLCB1bmxpc3QoYWdncmVnYXRlZF9yZXN1bHRzXzRbbiwgMTBdKSksICIsICIpCiAgCiAgTm9pc3lJbmZvcm1lZDJfcG5sX3NldDQgPC0gc3Ryc3BsaXQoZ3N1YigiXFxbfFxcXSIsICIiLCB1bmxpc3QoYWdncmVnYXRlZF9yZXN1bHRzXzRbbiwgMTJdKSksICIsICIpCiAgCiAgTm9pc3kxX3BubF9zZXQ0IDwtIHN0cnNwbGl0KGdzdWIoIlxcW3xcXF0iLCAiIiwgdW5saXN0KGFnZ3JlZ2F0ZWRfcmVzdWx0c180W24sIDE0XSkpLCAiLCAiKQogIAogIE5vaXN5Ml9wbmxfc2V0NCA8LSBzdHJzcGxpdChnc3ViKCJcXFt8XFxdIiwgIiIsIHVubGlzdChhZ2dyZWdhdGVkX3Jlc3VsdHNfNFtuLCAxNl0pKSwgIiwgIikKICAKICBTdG9jaE5vaXN5X3BubF9zZXQ0IDwtIHN0cnNwbGl0KGdzdWIoIlxcW3xcXF0iLCAiIiwgdW5saXN0KGFnZ3JlZ2F0ZWRfcmVzdWx0c180W24sIDE4XSkpLCAiLCAiKQogIAogICMgTG9vcCB0aHJvdWdoIGVhY2ggcG9zaXRpb24gKGkpCiAgZm9yIChpIGluIDE6MTAwKSB7CiAgICAjIEV4dHJhY3QgVHJ1ZSBhbmQgRXhwZWN0ZWQgdmFsdWVzIGZvciB0aGUgaS10aCBwb3NpdGlvbgogICAgTU1fcG5sIDwtIHNhcHBseShNTV9wbmxfc2V0NCwgZnVuY3Rpb24oeCkgYXMubnVtZXJpYyh4W2ldKSkKICAgIEluZm9ybWVkX3BubCA8LSBzYXBwbHkoSW5mb3JtZWRfcG5sX3NldDQsIGZ1bmN0aW9uKHgpIGFzLm51bWVyaWMoeFtpXSkpCiAgICBOb2lzeUluZm9ybWVkMV9wbmwgPC0gc2FwcGx5KE5vaXN5SW5mb3JtZWQxX3BubF9zZXQ0LCBmdW5jdGlvbih4KSBhcy5udW1lcmljKHhbaV0pKQogICAgTm9pc3lJbmZvcm1lZDJfcG5sIDwtIHNhcHBseShOb2lzeUluZm9ybWVkMl9wbmxfc2V0NCwgZnVuY3Rpb24oeCkgYXMubnVtZXJpYyh4W2ldKSkKICAgIE5vaXN5MV9wbmwgPC0gc2FwcGx5KE5vaXN5MV9wbmxfc2V0NCwgZnVuY3Rpb24oeCkgYXMubnVtZXJpYyh4W2ldKSkKICAgIE5vaXN5Ml9wbmwgPC0gc2FwcGx5KE5vaXN5Ml9wbmxfc2V0NCwgZnVuY3Rpb24oeCkgYXMubnVtZXJpYyh4W2ldKSkKICAgIFN0b2NoTm9pc3lfcG5sIDwtIHNhcHBseShTdG9jaE5vaXN5X3BubF9zZXQ0LCBmdW5jdGlvbih4KSBhcy5udW1lcmljKHhbaV0pKQogICAgCiAgICAjIENhbGN1bGF0ZSB0aGUgYXZlcmFnZSBvZiBUcnVlIGFuZCBFeHBlY3RlZCB2YWx1ZXMgZm9yIHRoZSBpLXRoIHBvc2l0aW9uCiAgICBhdmVyYWdlX01NX3BubFtpLCBuXSA8LSBtZWFuKE1NX3BubCwgbmEucm0gPSBUUlVFKQogICAgYXZlcmFnZV9JbmZvcm1lZF9wbmxbaSwgbl0gPC0gbWVhbihJbmZvcm1lZF9wbmwsIG5hLnJtID0gVFJVRSkKICAgIGF2ZXJhZ2VfTm9pc3lJbmZvcm1lZDFfcG5sW2ksIG5dIDwtIG1lYW4oTm9pc3lJbmZvcm1lZDFfcG5sLCBuYS5ybSA9IFRSVUUpCiAgICBhdmVyYWdlX05vaXN5SW5mb3JtZWQyX3BubFtpLCBuXSA8LSBtZWFuKE5vaXN5SW5mb3JtZWQyX3BubCwgbmEucm0gPSBUUlVFKQogICAgYXZlcmFnZV9Ob2lzeTFfcG5sW2ksIG5dIDwtIG1lYW4oTm9pc3kxX3BubCwgbmEucm0gPSBUUlVFKQogICAgYXZlcmFnZV9Ob2lzeTJfcG5sW2ksIG5dIDwtIG1lYW4oTm9pc3kyX3BubCwgbmEucm0gPSBUUlVFKQogICAgYXZlcmFnZV9TdG9jaE5vaXN5X3BubFtpLCBuXSA8LSBtZWFuKFN0b2NoTm9pc3lfcG5sLCBuYS5ybSA9IFRSVUUpCiAgfQp9CgojIENhbGN1bGF0ZSB0aGUgb3ZlcmFsbCBhdmVyYWdlIGZvciBlYWNoIHBvc2l0aW9uIGFjcm9zcyBhbGwgc2ltdWxhdGlvbnMKb3ZlcmFsbF9hdmVyYWdlX01NX3BubCA8LSByb3dNZWFucyhhdmVyYWdlX01NX3BubCwgbmEucm0gPSBUUlVFKQpvdmVyYWxsX2F2ZXJhZ2VfSW5mb3JtZWRfcG5sIDwtIHJvd01lYW5zKGF2ZXJhZ2VfSW5mb3JtZWRfcG5sLCBuYS5ybSA9IFRSVUUpCm92ZXJhbGxfYXZlcmFnZV9Ob2lzeUluZm9ybWVkMV9wbmwgPC0gcm93TWVhbnMoYXZlcmFnZV9Ob2lzeUluZm9ybWVkMV9wbmwsIG5hLnJtID0gVFJVRSkKb3ZlcmFsbF9hdmVyYWdlX05vaXN5SW5mb3JtZWQyX3BubCA8LSByb3dNZWFucyhhdmVyYWdlX05vaXN5SW5mb3JtZWQyX3BubCwgbmEucm0gPSBUUlVFKQpvdmVyYWxsX2F2ZXJhZ2VfTm9pc3kxX3BubCA8LSByb3dNZWFucyhhdmVyYWdlX05vaXN5MV9wbmwsIG5hLnJtID0gVFJVRSkKb3ZlcmFsbF9hdmVyYWdlX05vaXN5Ml9wbmwgPC0gcm93TWVhbnMoYXZlcmFnZV9Ob2lzeTJfcG5sLCBuYS5ybSA9IFRSVUUpCm92ZXJhbGxfYXZlcmFnZV9TdG9jaE5vaXN5X3BubCA8LSByb3dNZWFucyhhdmVyYWdlX1N0b2NoTm9pc3lfcG5sLCBuYS5ybSA9IFRSVUUpCgojIFBsb3QgdGhlIG92ZXJhbGwgYXZlcmFnZXMKcGxvdChvdmVyYWxsX2F2ZXJhZ2VfTU1fcG5sLCB0eXBlID0gImwiLCBwY2ggPSAxNiwgY29sID0gImJsYWNrIiwgbWFpbiA9ICJPdmVyYWxsIEF2ZXJhZ2UgUE5MIiwgeGxhYiA9ICJQb3NpdGlvbiBpbiBMaXN0IiwgeWxhYiA9ICJWYWx1ZSIsIHlsaW0gPSBjKG1pbihjKG92ZXJhbGxfYXZlcmFnZV9NTV9wbmwsIG92ZXJhbGxfYXZlcmFnZV9JbmZvcm1lZF9wbmwsIG92ZXJhbGxfYXZlcmFnZV9Ob2lzeUluZm9ybWVkMV9wbmwsIG92ZXJhbGxfYXZlcmFnZV9Ob2lzeUluZm9ybWVkMl9wbmwsIG92ZXJhbGxfYXZlcmFnZV9Ob2lzeTFfcG5sLCBvdmVyYWxsX2F2ZXJhZ2VfTm9pc3kyX3BubCwgb3ZlcmFsbF9hdmVyYWdlX1N0b2NoTm9pc3lfcG5sKSksIG1heChjKG92ZXJhbGxfYXZlcmFnZV9NTV9wbmwsIG92ZXJhbGxfYXZlcmFnZV9JbmZvcm1lZF9wbmwsIG92ZXJhbGxfYXZlcmFnZV9Ob2lzeUluZm9ybWVkMV9wbmwsIG92ZXJhbGxfYXZlcmFnZV9Ob2lzeUluZm9ybWVkMl9wbmwsIG92ZXJhbGxfYXZlcmFnZV9Ob2lzeTFfcG5sLCBvdmVyYWxsX2F2ZXJhZ2VfTm9pc3kyX3BubCwgb3ZlcmFsbF9hdmVyYWdlX1N0b2NoTm9pc3lfcG5sKSkpKQpsaW5lcyhvdmVyYWxsX2F2ZXJhZ2VfSW5mb3JtZWRfcG5sLCB0eXBlID0gImwiLCBwY2ggPSAxNiwgY29sID0gInJlZCIpCmxpbmVzKG92ZXJhbGxfYXZlcmFnZV9Ob2lzeUluZm9ybWVkMV9wbmwsIHR5cGUgPSAibCIsIHBjaCA9IDE2LCBjb2wgPSAiZ3JlZW4iKQpsaW5lcyhvdmVyYWxsX2F2ZXJhZ2VfTm9pc3lJbmZvcm1lZDJfcG5sLCB0eXBlID0gImwiLCBwY2ggPSAxNiwgY29sID0gInllbGxvdyIpCmxpbmVzKG92ZXJhbGxfYXZlcmFnZV9Ob2lzeTFfcG5sLCB0eXBlID0gImwiLCBwY2ggPSAxNiwgY29sID0gImJsdWUiKQpsaW5lcyhvdmVyYWxsX2F2ZXJhZ2VfTm9pc3kyX3BubCwgdHlwZSA9ICJsIiwgcGNoID0gMTYsIGNvbCA9ICJwdXJwbGUiKQpsaW5lcyhvdmVyYWxsX2F2ZXJhZ2VfU3RvY2hOb2lzeV9wbmwsIHR5cGUgPSAibCIsIHBjaCA9IDE2LCBjb2wgPSAib3JhbmdlIikKCiMgQWRkIGxlZ2VuZApsZWdlbmQoImJvdHRvbWxlZnQiLCBsZWdlbmQgPSBjKCJNYXJrZXQgTWFrZXIiLCAiSW5mb3JtZWQiLCAiTm9pc3kgSW5mb3JtZWQgMSIsICJOb2lzeSBJbmZvcm1lZCAyIiwgIk5vaXN5IDEiLCAiTm9pc3kgMiIsICJTdG9jaGFzdGljIE5vaXN5IiksIGNvbCA9IGMoImJsYWNrIiwgInJlZCIsICJncmVlbiIsICJ5ZWxsb3ciLCAiYmx1ZSIsICJwdXJwbGUiLCAib3JhbmdlIiksIGx0eSA9IDEsIGNleCA9IDAuOCkKYGBgCgoKYGBge3J9CiMgSW5pdGlhbGl6ZSBlbXB0eSB2ZWN0b3JzIHRvIHN0b3JlIHRoZSBCaWQgYW5kIEFzayB2YWx1ZXMKTU1fcG9zX3NldDQgPC0gbnVtZXJpYygpCkluZm9ybWVkX3Bvc19zZXQ0IDwtIG51bWVyaWMoKQpOb2lzeUluZm9ybWVkMV9wb3Nfc2V0NCA8LSBudW1lcmljKCkKTm9pc3lJbmZvcm1lZDJfcG9zX3NldDQgPC0gbnVtZXJpYygpCk5vaXN5MV9wb3Nfc2V0NCA8LSBudW1lcmljKCkKTm9pc3kyX3Bvc19zZXQ0IDwtIG51bWVyaWMoKQpTdG9jaE5vaXN5X3Bvc19zZXQ0IDwtIG51bWVyaWMoKQoKIyBMb29wIHRocm91Z2ggZWFjaCBpdGVyYXRpb24gKG4pCmZvciAobiBpbiAxOjEwKSB7CgogIE1NX3Bvc192YWx1ZXMgPC0gc3Ryc3BsaXQoZ3N1YigiXFxbfFxcXSIsICIiLCB1bmxpc3QoYWdncmVnYXRlZF9yZXN1bHRzXzRbbiwgN10pKSwgIiwgIilbWzFdXQogIAogIEluZm9ybWVkX3Bvc192YWx1ZXMgPC0gc3Ryc3BsaXQoZ3N1YigiXFxbfFxcXSIsICIiLCB1bmxpc3QoYWdncmVnYXRlZF9yZXN1bHRzXzRbbiwgOV0pKSwgIiwgIilbWzFdXQogIAogIE5vaXN5SW5mb3JtZWQxX3Bvc192YWx1ZXMgPC0gc3Ryc3BsaXQoZ3N1YigiXFxbfFxcXSIsICIiLCB1bmxpc3QoYWdncmVnYXRlZF9yZXN1bHRzXzRbbiwgMTFdKSksICIsICIpW1sxXV0KICAKICBOb2lzeUluZm9ybWVkMl9wb3NfdmFsdWVzIDwtIHN0cnNwbGl0KGdzdWIoIlxcW3xcXF0iLCAiIiwgdW5saXN0KGFnZ3JlZ2F0ZWRfcmVzdWx0c180W24sIDEzXSkpLCAiLCAiKVtbMV1dCiAgCiAgTm9pc3kxX3Bvc192YWx1ZXMgPC0gc3Ryc3BsaXQoZ3N1YigiXFxbfFxcXSIsICIiLCB1bmxpc3QoYWdncmVnYXRlZF9yZXN1bHRzXzRbbiwgMTVdKSksICIsICIpW1sxXV0KICAKICBOb2lzeTJfcG9zX3ZhbHVlcyA8LSBzdHJzcGxpdChnc3ViKCJcXFt8XFxdIiwgIiIsIHVubGlzdChhZ2dyZWdhdGVkX3Jlc3VsdHNfNFtuLCAxN10pKSwgIiwgIilbWzFdXQogIAogIFN0b2NoTm9pc3lfcG9zX3ZhbHVlcyA8LSBzdHJzcGxpdChnc3ViKCJcXFt8XFxdIiwgIiIsIHVubGlzdChhZ2dyZWdhdGVkX3Jlc3VsdHNfNFtuLCAxOV0pKSwgIiwgIilbWzFdXQogIAogICMgQ29udmVydCBCaWQgYW5kIEFzayB2YWx1ZXMgdG8gbnVtZXJpYyBhbmQgYXBwZW5kIHRvIHRoZSB2ZWN0b3JzCiAgTU1fcG9zX3NldDQgPC0gYyhNTV9wb3Nfc2V0NCwgYXMubnVtZXJpYyhNTV9wb3NfdmFsdWVzKSkKICBJbmZvcm1lZF9wb3Nfc2V0NCA8LSBjKEluZm9ybWVkX3Bvc19zZXQ0LCBhcy5udW1lcmljKEluZm9ybWVkX3Bvc192YWx1ZXMpKQogIE5vaXN5SW5mb3JtZWQxX3Bvc19zZXQ0IDwtIGMoTm9pc3lJbmZvcm1lZDFfcG9zX3NldDQsIGFzLm51bWVyaWMoTm9pc3lJbmZvcm1lZDFfcG9zX3ZhbHVlcykpCiAgTm9pc3lJbmZvcm1lZDJfcG9zX3NldDQgPC0gYyhOb2lzeUluZm9ybWVkMl9wb3Nfc2V0NCwgYXMubnVtZXJpYyhOb2lzeUluZm9ybWVkMl9wb3NfdmFsdWVzKSkKICBOb2lzeTFfcG9zX3NldDQgPC0gYyhOb2lzeV9wb3Nfc2V0NCwgYXMubnVtZXJpYyhOb2lzeTFfcG9zX3ZhbHVlcykpCiAgTm9pc3kyX3Bvc19zZXQ0IDwtIGMoTm9pc3kyX3Bvc19zZXQ0LCBhcy5udW1lcmljKE5vaXN5Ml9wb3NfdmFsdWVzKSkKICBTdG9jaE5vaXN5X3Bvc19zZXQ0IDwtIGMoU3RvY2hOb2lzeV9wb3Nfc2V0NCwgYXMubnVtZXJpYyhTdG9jaE5vaXN5X3Bvc192YWx1ZXMpKQp9CgojIENhbGN1bGF0ZSB0aGUgYXZlcmFnZSBvZiBCaWQgYW5kIEFzayB2YWx1ZXMKI2F2ZXJhZ2VfTU0gPC0gbWVhbihNTV9zZXQ0LCBuYS5ybSA9IFRSVUUpCiNhdmVyYWdlX0lOIDwtIG1lYW4oSU5fc2V0NCwgbmEucm0gPSBUUlVFKQoKIyBQbG90IHRoZSBCaWQgYW5kIEFzayB2YWx1ZXMgb24gdGhlIHNhbWUgcGxvdApwbG90KE1NX3Bvc19zZXQ0LCB0eXBlID0gImwiLCBwY2ggPSAxNiwgY29sID0gImJsYWNrIiwgbWFpbiA9ICJQb3NpdGlvbiBpbiBzZXQgNCIsIHhsYWIgPSAiSXRlcmF0aW9uIiwgeWxhYiA9ICJWYWx1ZSIsIHlsaW0gPSBjKG1pbihjKE1NX3Bvc19zZXQ0LCBJbmZvcm1lZF9wb3Nfc2V0NCwgTm9pc3lJbmZvcm1lZDFfcG9zX3NldDQsIE5vaXN5SW5mb3JtZWQyX3Bvc19zZXQ0LCBOb2lzeTFfcG9zX3NldDQsIE5vaXN5Ml9wb3Nfc2V0NCwgU3RvY2hOb2lzeV9wb3Nfc2V0NCkpLCBtYXgoYyhNTV9wb3Nfc2V0NCwgSW5mb3JtZWRfcG9zX3NldDQsIE5vaXN5SW5mb3JtZWQxX3Bvc19zZXQ0LCBOb2lzeUluZm9ybWVkMl9wb3Nfc2V0NCwgTm9pc3kxX3Bvc19zZXQ0LCBOb2lzeTJfcG9zX3NldDQsIFN0b2NoTm9pc3lfcG9zX3NldDQpKSkpCmxpbmVzKEluZm9ybWVkX3Bvc19zZXQ0LCB0eXBlID0gImwiLCBwY2ggPSAxNiwgY29sID0gInJlZCIpCmxpbmVzKE5vaXN5SW5mb3JtZWQxX3Bvc19zZXQ0LCB0eXBlID0gImwiLCBwY2ggPSAxNiwgY29sID0gImdyZWVuIikKbGluZXMoTm9pc3lJbmZvcm1lZDJfcG9zX3NldDQsIHR5cGUgPSAibCIsIHBjaCA9IDE2LCBjb2wgPSAieWVsbG93IikKbGluZXMoTm9pc3kxX3Bvc19zZXQ0LCB0eXBlID0gImwiLCBwY2ggPSAxNiwgY29sID0gImJsdWUiKQpsaW5lcyhOb2lzeTJfcG9zX3NldDQsIHR5cGUgPSAibCIsIHBjaCA9IDE2LCBjb2wgPSAicHVycGxlIikKbGluZXMoU3RvY2hOb2lzeV9wb3Nfc2V0NCwgdHlwZSA9ICJsIiwgcGNoID0gMTYsIGNvbCA9ICJvcmFuZ2UiKQoKCiMgQWRkIGxlZ2VuZApsZWdlbmQoInRvcGxlZnQiLCBsZWdlbmQgPSBjKCJNYXJrZXQgTWFrZXIiLCAiSW5mb3JtZWQiLCAiTm9pc3kgSW5mb3JtZWQgMSIsICJOb2lzeSBJbmZvcm1lZCAyIiwgIk5vaXN5IDEiLCAiTm9pc3kgMiIsICJTdG9jaGFzdGljIE5vaXN5IiksIGNvbCA9IGMoImJsYWNrIiwgInJlZCIsICJncmVlbiIsICJ5ZWxsb3ciLCAiYmx1ZSIsICJwdXJwbGUiLCAib3JhbmdlIiksIGx0eSA9IDEsIGNleCA9IDAuOCkKCiMgQWRkIGhvcml6b250YWwgbGluZXMgZm9yIHRoZSBhdmVyYWdlcwojYWJsaW5lKGggPSBhdmVyYWdlX01NLCBjb2wgPSAiYmx1ZSIsIGx0eSA9IDEpCiNhYmxpbmUoaCA9IGF2ZXJhZ2VfSU4sIGNvbCA9ICJyZWQiLCBsdHkgPSAxKQpgYGAKCgpgYGB7cn0KIyBJbml0aWFsaXplIG1hdHJpY2VzIHRvIHN0b3JlIGF2ZXJhZ2VzIGZvciBlYWNoIHBvc2l0aW9uCmF2ZXJhZ2VfTU1fcG9zIDwtIG1hdHJpeChOQSwgbnJvdyA9IDEwMCwgbmNvbCA9IDEwKQphdmVyYWdlX0luZm9ybWVkX3BvcyA8LSBtYXRyaXgoTkEsIG5yb3cgPSAxMDAsIG5jb2wgPSAxMCkKYXZlcmFnZV9Ob2lzeUluZm9ybWVkMV9wb3MgPC0gbWF0cml4KE5BLCBucm93ID0gMTAwLCBuY29sID0gMTApCmF2ZXJhZ2VfTm9pc3lJbmZvcm1lZDJfcG9zIDwtIG1hdHJpeChOQSwgbnJvdyA9IDEwMCwgbmNvbCA9IDEwKQphdmVyYWdlX05vaXN5MV9wb3MgPC0gbWF0cml4KE5BLCBucm93ID0gMTAwLCBuY29sID0gMTApCmF2ZXJhZ2VfTm9pc3kyX3BvcyA8LSBtYXRyaXgoTkEsIG5yb3cgPSAxMDAsIG5jb2wgPSAxMCkKYXZlcmFnZV9TdG9jaE5vaXN5X3BvcyA8LSBtYXRyaXgoTkEsIG5yb3cgPSAxMDAsIG5jb2wgPSAxMCkKCiMgTG9vcCB0aHJvdWdoIGVhY2ggc2ltdWxhdGlvbiAobikKZm9yIChuIGluIDE6MTApIHsKCiAgTU1fcG9zX3NldDQgPC0gc3Ryc3BsaXQoZ3N1YigiXFxbfFxcXSIsICIiLCB1bmxpc3QoYWdncmVnYXRlZF9yZXN1bHRzXzRbbiwgN10pKSwgIiwgIikKCiAgSW5mb3JtZWRfcG9zX3NldDQgPC0gc3Ryc3BsaXQoZ3N1YigiXFxbfFxcXSIsICIiLCB1bmxpc3QoYWdncmVnYXRlZF9yZXN1bHRzXzRbbiwgOV0pKSwgIiwgIikKICAKICBOb2lzeUluZm9ybWVkMV9wb3Nfc2V0NCA8LSBzdHJzcGxpdChnc3ViKCJcXFt8XFxdIiwgIiIsIHVubGlzdChhZ2dyZWdhdGVkX3Jlc3VsdHNfNFtuLCAxMV0pKSwgIiwgIikKICAKICBOb2lzeUluZm9ybWVkMl9wb3Nfc2V0NCA8LSBzdHJzcGxpdChnc3ViKCJcXFt8XFxdIiwgIiIsIHVubGlzdChhZ2dyZWdhdGVkX3Jlc3VsdHNfNFtuLCAxM10pKSwgIiwgIikKICAKICBOb2lzeTFfcG9zX3NldDQgPC0gc3Ryc3BsaXQoZ3N1YigiXFxbfFxcXSIsICIiLCB1bmxpc3QoYWdncmVnYXRlZF9yZXN1bHRzXzRbbiwgMTVdKSksICIsICIpCiAgCiAgTm9pc3kyX3Bvc19zZXQ0IDwtIHN0cnNwbGl0KGdzdWIoIlxcW3xcXF0iLCAiIiwgdW5saXN0KGFnZ3JlZ2F0ZWRfcmVzdWx0c180W24sIDE3XSkpLCAiLCAiKQogIAogIFN0b2NoTm9pc3lfcG9zX3NldDQgPC0gc3Ryc3BsaXQoZ3N1YigiXFxbfFxcXSIsICIiLCB1bmxpc3QoYWdncmVnYXRlZF9yZXN1bHRzXzRbbiwgMTldKSksICIsICIpCiAgCiAgIyBMb29wIHRocm91Z2ggZWFjaCBwb3NpdGlvbiAoaSkKICBmb3IgKGkgaW4gMToxMDApIHsKICAgICMgRXh0cmFjdCBUcnVlIGFuZCBFeHBlY3RlZCB2YWx1ZXMgZm9yIHRoZSBpLXRoIHBvc2l0aW9uCiAgICBNTV9wb3MgPC0gc2FwcGx5KE1NX3Bvc19zZXQ0LCBmdW5jdGlvbih4KSBhcy5udW1lcmljKHhbaV0pKQogICAgSW5mb3JtZWRfcG9zIDwtIHNhcHBseShJbmZvcm1lZF9wb3Nfc2V0NCwgZnVuY3Rpb24oeCkgYXMubnVtZXJpYyh4W2ldKSkKICAgIE5vaXN5SW5mb3JtZWQxX3BvcyA8LSBzYXBwbHkoTm9pc3lJbmZvcm1lZDFfcG9zX3NldDQsIGZ1bmN0aW9uKHgpIGFzLm51bWVyaWMoeFtpXSkpCiAgICBOb2lzeUluZm9ybWVkMl9wb3MgPC0gc2FwcGx5KE5vaXN5SW5mb3JtZWQyX3Bvc19zZXQ0LCBmdW5jdGlvbih4KSBhcy5udW1lcmljKHhbaV0pKQogICAgTm9pc3kxX3BvcyA8LSBzYXBwbHkoTm9pc3kxX3Bvc19zZXQ0LCBmdW5jdGlvbih4KSBhcy5udW1lcmljKHhbaV0pKQogICAgTm9pc3kyX3BvcyA8LSBzYXBwbHkoTm9pc3kyX3Bvc19zZXQ0LCBmdW5jdGlvbih4KSBhcy5udW1lcmljKHhbaV0pKQogICAgU3RvY2hOb2lzeV9wb3MgPC0gc2FwcGx5KFN0b2NoTm9pc3lfcG9zX3NldDQsIGZ1bmN0aW9uKHgpIGFzLm51bWVyaWMoeFtpXSkpCiAgICAKICAgICMgQ2FsY3VsYXRlIHRoZSBhdmVyYWdlIG9mIFRydWUgYW5kIEV4cGVjdGVkIHZhbHVlcyBmb3IgdGhlIGktdGggcG9zaXRpb24KICAgIGF2ZXJhZ2VfTU1fcG9zW2ksIG5dIDwtIG1lYW4oTU1fcG9zLCBuYS5ybSA9IFRSVUUpCiAgICBhdmVyYWdlX0luZm9ybWVkX3Bvc1tpLCBuXSA8LSBtZWFuKEluZm9ybWVkX3BvcywgbmEucm0gPSBUUlVFKQogICAgYXZlcmFnZV9Ob2lzeUluZm9ybWVkMV9wb3NbaSwgbl0gPC0gbWVhbihOb2lzeUluZm9ybWVkMV9wb3MsIG5hLnJtID0gVFJVRSkKICAgIGF2ZXJhZ2VfTm9pc3lJbmZvcm1lZDJfcG9zW2ksIG5dIDwtIG1lYW4oTm9pc3lJbmZvcm1lZDJfcG9zLCBuYS5ybSA9IFRSVUUpCiAgICBhdmVyYWdlX05vaXN5MV9wb3NbaSwgbl0gPC0gbWVhbihOb2lzeTFfcG9zLCBuYS5ybSA9IFRSVUUpCiAgICBhdmVyYWdlX05vaXN5Ml9wb3NbaSwgbl0gPC0gbWVhbihOb2lzeTJfcG9zLCBuYS5ybSA9IFRSVUUpCiAgICBhdmVyYWdlX1N0b2NoTm9pc3lfcG9zW2ksIG5dIDwtIG1lYW4oU3RvY2hOb2lzeV9wb3MsIG5hLnJtID0gVFJVRSkKICB9Cn0KCiMgQ2FsY3VsYXRlIHRoZSBvdmVyYWxsIGF2ZXJhZ2UgZm9yIGVhY2ggcG9zaXRpb24gYWNyb3NzIGFsbCBzaW11bGF0aW9ucwpvdmVyYWxsX2F2ZXJhZ2VfTU1fcG9zIDwtIHJvd01lYW5zKGF2ZXJhZ2VfTU1fcG9zLCBuYS5ybSA9IFRSVUUpCm92ZXJhbGxfYXZlcmFnZV9JbmZvcm1lZF9wb3MgPC0gcm93TWVhbnMoYXZlcmFnZV9JbmZvcm1lZF9wb3MsIG5hLnJtID0gVFJVRSkKb3ZlcmFsbF9hdmVyYWdlX05vaXN5SW5mb3JtZWQxX3BvcyA8LSByb3dNZWFucyhhdmVyYWdlX05vaXN5SW5mb3JtZWQxX3BvcywgbmEucm0gPSBUUlVFKQpvdmVyYWxsX2F2ZXJhZ2VfTm9pc3lJbmZvcm1lZDJfcG9zIDwtIHJvd01lYW5zKGF2ZXJhZ2VfTm9pc3lJbmZvcm1lZDJfcG9zLCBuYS5ybSA9IFRSVUUpCm92ZXJhbGxfYXZlcmFnZV9Ob2lzeTFfcG9zIDwtIHJvd01lYW5zKGF2ZXJhZ2VfTm9pc3kxX3BvcywgbmEucm0gPSBUUlVFKQpvdmVyYWxsX2F2ZXJhZ2VfTm9pc3kyX3BvcyA8LSByb3dNZWFucyhhdmVyYWdlX05vaXN5Ml9wb3MsIG5hLnJtID0gVFJVRSkKb3ZlcmFsbF9hdmVyYWdlX1N0b2NoTm9pc3lfcG9zIDwtIHJvd01lYW5zKGF2ZXJhZ2VfU3RvY2hOb2lzeV9wb3MsIG5hLnJtID0gVFJVRSkKCiMgUGxvdCB0aGUgb3ZlcmFsbCBhdmVyYWdlcwpwbG90KG92ZXJhbGxfYXZlcmFnZV9NTV9wb3MsIHR5cGUgPSAibCIsIHBjaCA9IDE2LCBjb2wgPSAiYmxhY2siLCBtYWluID0gIk92ZXJhbGwgQXZlcmFnZSBQb3NpdGlvbiIsIHhsYWIgPSAiUG9zaXRpb24gaW4gTGlzdCIsIHlsYWIgPSAiVmFsdWUiLCB5bGltID0gYyhtaW4oYyhvdmVyYWxsX2F2ZXJhZ2VfTU1fcG9zLCBvdmVyYWxsX2F2ZXJhZ2VfSW5mb3JtZWRfcG9zLCBvdmVyYWxsX2F2ZXJhZ2VfTm9pc3lJbmZvcm1lZDFfcG9zLCBvdmVyYWxsX2F2ZXJhZ2VfTm9pc3lJbmZvcm1lZDJfcG9zLCBvdmVyYWxsX2F2ZXJhZ2VfTm9pc3kxX3Bvcywgb3ZlcmFsbF9hdmVyYWdlX05vaXN5Ml9wb3MsIG92ZXJhbGxfYXZlcmFnZV9TdG9jaE5vaXN5X3BvcykpLCBtYXgoYyhvdmVyYWxsX2F2ZXJhZ2VfTU1fcG9zLCBvdmVyYWxsX2F2ZXJhZ2VfSW5mb3JtZWRfcG9zLCBvdmVyYWxsX2F2ZXJhZ2VfTm9pc3lJbmZvcm1lZDFfcG9zLCBvdmVyYWxsX2F2ZXJhZ2VfTm9pc3lJbmZvcm1lZDJfcG9zLCBvdmVyYWxsX2F2ZXJhZ2VfTm9pc3kxX3Bvcywgb3ZlcmFsbF9hdmVyYWdlX05vaXN5Ml9wb3MsIG92ZXJhbGxfYXZlcmFnZV9TdG9jaE5vaXN5X3BvcykpKSkKbGluZXMob3ZlcmFsbF9hdmVyYWdlX0luZm9ybWVkX3BvcywgdHlwZSA9ICJsIiwgcGNoID0gMTYsIGNvbCA9ICJyZWQiKQpsaW5lcyhvdmVyYWxsX2F2ZXJhZ2VfTm9pc3lJbmZvcm1lZDFfcG9zLCB0eXBlID0gImwiLCBwY2ggPSAxNiwgY29sID0gImdyZWVuIikKbGluZXMob3ZlcmFsbF9hdmVyYWdlX05vaXN5SW5mb3JtZWQyX3BvcywgdHlwZSA9ICJsIiwgcGNoID0gMTYsIGNvbCA9ICJ5ZWxsb3ciKQpsaW5lcyhvdmVyYWxsX2F2ZXJhZ2VfTm9pc3kxX3BvcywgdHlwZSA9ICJsIiwgcGNoID0gMTYsIGNvbCA9ICJibHVlIikKbGluZXMob3ZlcmFsbF9hdmVyYWdlX05vaXN5Ml9wb3MsIHR5cGUgPSAibCIsIHBjaCA9IDE2LCBjb2wgPSAicHVycGxlIikKbGluZXMob3ZlcmFsbF9hdmVyYWdlX1N0b2NoTm9pc3lfcG9zLCB0eXBlID0gImwiLCBwY2ggPSAxNiwgY29sID0gIm9yYW5nZSIpCgojIEFkZCBsZWdlbmQKbGVnZW5kKCJib3R0b21sZWZ0IiwgbGVnZW5kID0gYygiTWFya2V0IE1ha2VyIiwgIkluZm9ybWVkIiwgIk5vaXN5IEluZm9ybWVkIDEiLCAiTm9pc3kgSW5mb3JtZWQgMiIsICJOb2lzeSAxIiwgIk5vaXN5IDIiLCAiU3RvY2hhc3RpYyBOb2lzeSIpLCBjb2wgPSBjKCJibGFjayIsICJyZWQiLCAiZ3JlZW4iLCAieWVsbG93IiwgImJsdWUiLCAicHVycGxlIiwgIm9yYW5nZSIpLCBsdHkgPSAxLCBjZXggPSAwLjgpCmBgYAoKIyMjIHNldCA0IHdpdGggc2lnbWEgPSAwLjI1CgpgYGB7cn0KIyBJbml0aWFsaXplIG1hdHJpY2VzIHRvIHN0b3JlIGF2ZXJhZ2VzIGZvciBlYWNoIHBvc2l0aW9uCmF2ZXJhZ2VfTU1fcG5sIDwtIG1hdHJpeChOQSwgbnJvdyA9IDEwMCwgbmNvbCA9IDEwKQphdmVyYWdlX0luZm9ybWVkX3BubCA8LSBtYXRyaXgoTkEsIG5yb3cgPSAxMDAsIG5jb2wgPSAxMCkKYXZlcmFnZV9Ob2lzeUluZm9ybWVkMV9wbmwgPC0gbWF0cml4KE5BLCBucm93ID0gMTAwLCBuY29sID0gMTApCmF2ZXJhZ2VfTm9pc3lJbmZvcm1lZDJfcG5sIDwtIG1hdHJpeChOQSwgbnJvdyA9IDEwMCwgbmNvbCA9IDEwKQphdmVyYWdlX05vaXN5MV9wbmwgPC0gbWF0cml4KE5BLCBucm93ID0gMTAwLCBuY29sID0gMTApCmF2ZXJhZ2VfTm9pc3kyX3BubCA8LSBtYXRyaXgoTkEsIG5yb3cgPSAxMDAsIG5jb2wgPSAxMCkKYXZlcmFnZV9TdG9jaE5vaXN5X3BubCA8LSBtYXRyaXgoTkEsIG5yb3cgPSAxMDAsIG5jb2wgPSAxMCkKCiMgTG9vcCB0aHJvdWdoIGVhY2ggc2ltdWxhdGlvbiAobikKZm9yIChuIGluIDE6MTApIHsKCiAgTU1fcG5sX3NldDRfMF8yNSA8LSBzdHJzcGxpdChnc3ViKCJcXFt8XFxdIiwgIiIsIHVubGlzdChhZ2dyZWdhdGVkX3Jlc3VsdHNfNF8wXzI1W24sIDZdKSksICIsICIpCgogIEluZm9ybWVkX3BubF9zZXQ0XzBfMjUgPC0gc3Ryc3BsaXQoZ3N1YigiXFxbfFxcXSIsICIiLCB1bmxpc3QoYWdncmVnYXRlZF9yZXN1bHRzXzRfMF8yNVtuLCA4XSkpLCAiLCAiKQogIAogIE5vaXN5SW5mb3JtZWQxX3BubF9zZXQ0XzBfMjUgPC0gc3Ryc3BsaXQoZ3N1YigiXFxbfFxcXSIsICIiLCB1bmxpc3QoYWdncmVnYXRlZF9yZXN1bHRzXzRfMF8yNVtuLCAxMF0pKSwgIiwgIikKICAKICBOb2lzeUluZm9ybWVkMl9wbmxfc2V0NF8wXzI1IDwtIHN0cnNwbGl0KGdzdWIoIlxcW3xcXF0iLCAiIiwgdW5saXN0KGFnZ3JlZ2F0ZWRfcmVzdWx0c180XzBfMjVbbiwgMTJdKSksICIsICIpCiAgCiAgTm9pc3kxX3BubF9zZXQ0XzBfMjUgPC0gc3Ryc3BsaXQoZ3N1YigiXFxbfFxcXSIsICIiLCB1bmxpc3QoYWdncmVnYXRlZF9yZXN1bHRzXzRfMF8yNVtuLCAxNF0pKSwgIiwgIikKICAKICBOb2lzeTJfcG5sX3NldDRfMF8yNSA8LSBzdHJzcGxpdChnc3ViKCJcXFt8XFxdIiwgIiIsIHVubGlzdChhZ2dyZWdhdGVkX3Jlc3VsdHNfNF8wXzI1W24sIDE2XSkpLCAiLCAiKQogIAogIFN0b2NoTm9pc3lfcG5sX3NldDRfMF8yNSA8LSBzdHJzcGxpdChnc3ViKCJcXFt8XFxdIiwgIiIsIHVubGlzdChhZ2dyZWdhdGVkX3Jlc3VsdHNfNF8wXzI1W24sIDE4XSkpLCAiLCAiKQogIAogICMgTG9vcCB0aHJvdWdoIGVhY2ggcG9zaXRpb24gKGkpCiAgZm9yIChpIGluIDE6MTAwKSB7CiAgICAjIEV4dHJhY3QgVHJ1ZSBhbmQgRXhwZWN0ZWQgdmFsdWVzIGZvciB0aGUgaS10aCBwb3NpdGlvbgogICAgTU1fcG5sIDwtIHNhcHBseShNTV9wbmxfc2V0NF8wXzI1LCBmdW5jdGlvbih4KSBhcy5udW1lcmljKHhbaV0pKQogICAgSW5mb3JtZWRfcG5sIDwtIHNhcHBseShJbmZvcm1lZF9wbmxfc2V0NF8wXzI1LCBmdW5jdGlvbih4KSBhcy5udW1lcmljKHhbaV0pKQogICAgTm9pc3lJbmZvcm1lZDFfcG5sIDwtIHNhcHBseShOb2lzeUluZm9ybWVkMV9wbmxfc2V0NF8wXzI1LCBmdW5jdGlvbih4KSBhcy5udW1lcmljKHhbaV0pKQogICAgTm9pc3lJbmZvcm1lZDJfcG5sIDwtIHNhcHBseShOb2lzeUluZm9ybWVkMl9wbmxfc2V0NF8wXzI1LCBmdW5jdGlvbih4KSBhcy5udW1lcmljKHhbaV0pKQogICAgTm9pc3kxX3BubCA8LSBzYXBwbHkoTm9pc3kxX3BubF9zZXQ0XzBfMjUsIGZ1bmN0aW9uKHgpIGFzLm51bWVyaWMoeFtpXSkpCiAgICBOb2lzeTJfcG5sIDwtIHNhcHBseShOb2lzeTJfcG5sX3NldDRfMF8yNSwgZnVuY3Rpb24oeCkgYXMubnVtZXJpYyh4W2ldKSkKICAgIFN0b2NoTm9pc3lfcG5sIDwtIHNhcHBseShTdG9jaE5vaXN5X3BubF9zZXQ0XzBfMjUsIGZ1bmN0aW9uKHgpIGFzLm51bWVyaWMoeFtpXSkpCiAgICAKICAgICMgQ2FsY3VsYXRlIHRoZSBhdmVyYWdlIG9mIFRydWUgYW5kIEV4cGVjdGVkIHZhbHVlcyBmb3IgdGhlIGktdGggcG9zaXRpb24KICAgIGF2ZXJhZ2VfTU1fcG5sW2ksIG5dIDwtIG1lYW4oTU1fcG5sLCBuYS5ybSA9IFRSVUUpCiAgICBhdmVyYWdlX0luZm9ybWVkX3BubFtpLCBuXSA8LSBtZWFuKEluZm9ybWVkX3BubCwgbmEucm0gPSBUUlVFKQogICAgYXZlcmFnZV9Ob2lzeUluZm9ybWVkMV9wbmxbaSwgbl0gPC0gbWVhbihOb2lzeUluZm9ybWVkMV9wbmwsIG5hLnJtID0gVFJVRSkKICAgIGF2ZXJhZ2VfTm9pc3lJbmZvcm1lZDJfcG5sW2ksIG5dIDwtIG1lYW4oTm9pc3lJbmZvcm1lZDJfcG5sLCBuYS5ybSA9IFRSVUUpCiAgICBhdmVyYWdlX05vaXN5MV9wbmxbaSwgbl0gPC0gbWVhbihOb2lzeTFfcG5sLCBuYS5ybSA9IFRSVUUpCiAgICBhdmVyYWdlX05vaXN5Ml9wbmxbaSwgbl0gPC0gbWVhbihOb2lzeTJfcG5sLCBuYS5ybSA9IFRSVUUpCiAgICBhdmVyYWdlX1N0b2NoTm9pc3lfcG5sW2ksIG5dIDwtIG1lYW4oU3RvY2hOb2lzeV9wbmwsIG5hLnJtID0gVFJVRSkKICB9Cn0KCiMgQ2FsY3VsYXRlIHRoZSBvdmVyYWxsIGF2ZXJhZ2UgZm9yIGVhY2ggcG9zaXRpb24gYWNyb3NzIGFsbCBzaW11bGF0aW9ucwpvdmVyYWxsX2F2ZXJhZ2VfTU1fcG5sIDwtIHJvd01lYW5zKGF2ZXJhZ2VfTU1fcG5sLCBuYS5ybSA9IFRSVUUpCm92ZXJhbGxfYXZlcmFnZV9JbmZvcm1lZF9wbmwgPC0gcm93TWVhbnMoYXZlcmFnZV9JbmZvcm1lZF9wbmwsIG5hLnJtID0gVFJVRSkKb3ZlcmFsbF9hdmVyYWdlX05vaXN5SW5mb3JtZWQxX3BubCA8LSByb3dNZWFucyhhdmVyYWdlX05vaXN5SW5mb3JtZWQxX3BubCwgbmEucm0gPSBUUlVFKQpvdmVyYWxsX2F2ZXJhZ2VfTm9pc3lJbmZvcm1lZDJfcG5sIDwtIHJvd01lYW5zKGF2ZXJhZ2VfTm9pc3lJbmZvcm1lZDJfcG5sLCBuYS5ybSA9IFRSVUUpCm92ZXJhbGxfYXZlcmFnZV9Ob2lzeTFfcG5sIDwtIHJvd01lYW5zKGF2ZXJhZ2VfTm9pc3kxX3BubCwgbmEucm0gPSBUUlVFKQpvdmVyYWxsX2F2ZXJhZ2VfTm9pc3kyX3BubCA8LSByb3dNZWFucyhhdmVyYWdlX05vaXN5Ml9wbmwsIG5hLnJtID0gVFJVRSkKb3ZlcmFsbF9hdmVyYWdlX1N0b2NoTm9pc3lfcG5sIDwtIHJvd01lYW5zKGF2ZXJhZ2VfU3RvY2hOb2lzeV9wbmwsIG5hLnJtID0gVFJVRSkKCiMgUGxvdCB0aGUgb3ZlcmFsbCBhdmVyYWdlcwpwbG90KG92ZXJhbGxfYXZlcmFnZV9NTV9wbmwsIHR5cGUgPSAibCIsIHBjaCA9IDE2LCBjb2wgPSAiYmxhY2siLCBtYWluID0gIk92ZXJhbGwgQXZlcmFnZSBQTkwgKHNpZ21hID0gMC4yNSkiLCB4bGFiID0gIlBvc2l0aW9uIGluIExpc3QiLCB5bGFiID0gIlZhbHVlIiwgeWxpbSA9IGMobWluKGMob3ZlcmFsbF9hdmVyYWdlX01NX3BubCwgb3ZlcmFsbF9hdmVyYWdlX0luZm9ybWVkX3BubCwgb3ZlcmFsbF9hdmVyYWdlX05vaXN5SW5mb3JtZWQxX3BubCwgb3ZlcmFsbF9hdmVyYWdlX05vaXN5SW5mb3JtZWQyX3BubCwgb3ZlcmFsbF9hdmVyYWdlX05vaXN5MV9wbmwsIG92ZXJhbGxfYXZlcmFnZV9Ob2lzeTJfcG5sLCBvdmVyYWxsX2F2ZXJhZ2VfU3RvY2hOb2lzeV9wbmwpKSwgbWF4KGMob3ZlcmFsbF9hdmVyYWdlX01NX3BubCwgb3ZlcmFsbF9hdmVyYWdlX0luZm9ybWVkX3BubCwgb3ZlcmFsbF9hdmVyYWdlX05vaXN5SW5mb3JtZWQxX3BubCwgb3ZlcmFsbF9hdmVyYWdlX05vaXN5SW5mb3JtZWQyX3BubCwgb3ZlcmFsbF9hdmVyYWdlX05vaXN5MV9wbmwsIG92ZXJhbGxfYXZlcmFnZV9Ob2lzeTJfcG5sLCBvdmVyYWxsX2F2ZXJhZ2VfU3RvY2hOb2lzeV9wbmwpKSkpCmxpbmVzKG92ZXJhbGxfYXZlcmFnZV9JbmZvcm1lZF9wbmwsIHR5cGUgPSAibCIsIHBjaCA9IDE2LCBjb2wgPSAicmVkIikKbGluZXMob3ZlcmFsbF9hdmVyYWdlX05vaXN5SW5mb3JtZWQxX3BubCwgdHlwZSA9ICJsIiwgcGNoID0gMTYsIGNvbCA9ICJncmVlbiIpCmxpbmVzKG92ZXJhbGxfYXZlcmFnZV9Ob2lzeUluZm9ybWVkMl9wbmwsIHR5cGUgPSAibCIsIHBjaCA9IDE2LCBjb2wgPSAieWVsbG93IikKbGluZXMob3ZlcmFsbF9hdmVyYWdlX05vaXN5MV9wbmwsIHR5cGUgPSAibCIsIHBjaCA9IDE2LCBjb2wgPSAiYmx1ZSIpCmxpbmVzKG92ZXJhbGxfYXZlcmFnZV9Ob2lzeTJfcG5sLCB0eXBlID0gImwiLCBwY2ggPSAxNiwgY29sID0gInB1cnBsZSIpCmxpbmVzKG92ZXJhbGxfYXZlcmFnZV9TdG9jaE5vaXN5X3BubCwgdHlwZSA9ICJsIiwgcGNoID0gMTYsIGNvbCA9ICJvcmFuZ2UiKQoKIyBBZGQgbGVnZW5kCmxlZ2VuZCgiYm90dG9tbGVmdCIsIGxlZ2VuZCA9IGMoIk1hcmtldCBNYWtlciIsICJJbmZvcm1lZCIsICJOb2lzeSBJbmZvcm1lZCAxIiwgIk5vaXN5IEluZm9ybWVkIDIiLCAiTm9pc3kgMSIsICJOb2lzeSAyIiwgIlN0b2NoYXN0aWMgTm9pc3kiKSwgY29sID0gYygiYmxhY2siLCAicmVkIiwgImdyZWVuIiwgInllbGxvdyIsICJibHVlIiwgInB1cnBsZSIsICJvcmFuZ2UiKSwgbHR5ID0gMSwgY2V4ID0gMC44KQpgYGAKCgojIyMgc2V0IDQgd2l0aCBzaWdtYSA9IDAuNzUKCmBgYHtyfQojIEluaXRpYWxpemUgbWF0cmljZXMgdG8gc3RvcmUgYXZlcmFnZXMgZm9yIGVhY2ggcG9zaXRpb24KYXZlcmFnZV9NTV9wbmwgPC0gbWF0cml4KE5BLCBucm93ID0gMTAwLCBuY29sID0gMTApCmF2ZXJhZ2VfSW5mb3JtZWRfcG5sIDwtIG1hdHJpeChOQSwgbnJvdyA9IDEwMCwgbmNvbCA9IDEwKQphdmVyYWdlX05vaXN5SW5mb3JtZWQxX3BubCA8LSBtYXRyaXgoTkEsIG5yb3cgPSAxMDAsIG5jb2wgPSAxMCkKYXZlcmFnZV9Ob2lzeUluZm9ybWVkMl9wbmwgPC0gbWF0cml4KE5BLCBucm93ID0gMTAwLCBuY29sID0gMTApCmF2ZXJhZ2VfTm9pc3kxX3BubCA8LSBtYXRyaXgoTkEsIG5yb3cgPSAxMDAsIG5jb2wgPSAxMCkKYXZlcmFnZV9Ob2lzeTJfcG5sIDwtIG1hdHJpeChOQSwgbnJvdyA9IDEwMCwgbmNvbCA9IDEwKQphdmVyYWdlX1N0b2NoTm9pc3lfcG5sIDwtIG1hdHJpeChOQSwgbnJvdyA9IDEwMCwgbmNvbCA9IDEwKQoKIyBMb29wIHRocm91Z2ggZWFjaCBzaW11bGF0aW9uIChuKQpmb3IgKG4gaW4gMToxMCkgewoKICBNTV9wbmxfc2V0NF8wXzc1IDwtIHN0cnNwbGl0KGdzdWIoIlxcW3xcXF0iLCAiIiwgdW5saXN0KGFnZ3JlZ2F0ZWRfcmVzdWx0c180XzBfNzVbbiwgNl0pKSwgIiwgIikKCiAgSW5mb3JtZWRfcG5sX3NldDRfMF83NSA8LSBzdHJzcGxpdChnc3ViKCJcXFt8XFxdIiwgIiIsIHVubGlzdChhZ2dyZWdhdGVkX3Jlc3VsdHNfNF8wXzc1W24sIDhdKSksICIsICIpCiAgCiAgTm9pc3lJbmZvcm1lZDFfcG5sX3NldDRfMF83NSA8LSBzdHJzcGxpdChnc3ViKCJcXFt8XFxdIiwgIiIsIHVubGlzdChhZ2dyZWdhdGVkX3Jlc3VsdHNfNF8wXzc1W24sIDEwXSkpLCAiLCAiKQogIAogIE5vaXN5SW5mb3JtZWQyX3BubF9zZXQ0XzBfNzUgPC0gc3Ryc3BsaXQoZ3N1YigiXFxbfFxcXSIsICIiLCB1bmxpc3QoYWdncmVnYXRlZF9yZXN1bHRzXzRfMF83NVtuLCAxMl0pKSwgIiwgIikKICAKICBOb2lzeTFfcG5sX3NldDRfMF83NSA8LSBzdHJzcGxpdChnc3ViKCJcXFt8XFxdIiwgIiIsIHVubGlzdChhZ2dyZWdhdGVkX3Jlc3VsdHNfNF8wXzc1W24sIDE0XSkpLCAiLCAiKQogIAogIE5vaXN5Ml9wbmxfc2V0NF8wXzc1IDwtIHN0cnNwbGl0KGdzdWIoIlxcW3xcXF0iLCAiIiwgdW5saXN0KGFnZ3JlZ2F0ZWRfcmVzdWx0c180XzBfNzVbbiwgMTZdKSksICIsICIpCiAgCiAgU3RvY2hOb2lzeV9wbmxfc2V0NF8wXzc1IDwtIHN0cnNwbGl0KGdzdWIoIlxcW3xcXF0iLCAiIiwgdW5saXN0KGFnZ3JlZ2F0ZWRfcmVzdWx0c180XzBfNzVbbiwgMThdKSksICIsICIpCiAgCiAgIyBMb29wIHRocm91Z2ggZWFjaCBwb3NpdGlvbiAoaSkKICBmb3IgKGkgaW4gMToxMDApIHsKICAgICMgRXh0cmFjdCBUcnVlIGFuZCBFeHBlY3RlZCB2YWx1ZXMgZm9yIHRoZSBpLXRoIHBvc2l0aW9uCiAgICBNTV9wbmwgPC0gc2FwcGx5KE1NX3BubF9zZXQ0XzBfNzUsIGZ1bmN0aW9uKHgpIGFzLm51bWVyaWMoeFtpXSkpCiAgICBJbmZvcm1lZF9wbmwgPC0gc2FwcGx5KEluZm9ybWVkX3BubF9zZXQ0XzBfNzUsIGZ1bmN0aW9uKHgpIGFzLm51bWVyaWMoeFtpXSkpCiAgICBOb2lzeUluZm9ybWVkMV9wbmwgPC0gc2FwcGx5KE5vaXN5SW5mb3JtZWQxX3BubF9zZXQ0XzBfNzUsIGZ1bmN0aW9uKHgpIGFzLm51bWVyaWMoeFtpXSkpCiAgICBOb2lzeUluZm9ybWVkMl9wbmwgPC0gc2FwcGx5KE5vaXN5SW5mb3JtZWQyX3BubF9zZXQ0XzBfNzUsIGZ1bmN0aW9uKHgpIGFzLm51bWVyaWMoeFtpXSkpCiAgICBOb2lzeTFfcG5sIDwtIHNhcHBseShOb2lzeTFfcG5sX3NldDRfMF83NSwgZnVuY3Rpb24oeCkgYXMubnVtZXJpYyh4W2ldKSkKICAgIE5vaXN5Ml9wbmwgPC0gc2FwcGx5KE5vaXN5Ml9wbmxfc2V0NF8wXzc1LCBmdW5jdGlvbih4KSBhcy5udW1lcmljKHhbaV0pKQogICAgU3RvY2hOb2lzeV9wbmwgPC0gc2FwcGx5KFN0b2NoTm9pc3lfcG5sX3NldDRfMF83NSwgZnVuY3Rpb24oeCkgYXMubnVtZXJpYyh4W2ldKSkKICAgIAogICAgIyBDYWxjdWxhdGUgdGhlIGF2ZXJhZ2Ugb2YgVHJ1ZSBhbmQgRXhwZWN0ZWQgdmFsdWVzIGZvciB0aGUgaS10aCBwb3NpdGlvbgogICAgYXZlcmFnZV9NTV9wbmxbaSwgbl0gPC0gbWVhbihNTV9wbmwsIG5hLnJtID0gVFJVRSkKICAgIGF2ZXJhZ2VfSW5mb3JtZWRfcG5sW2ksIG5dIDwtIG1lYW4oSW5mb3JtZWRfcG5sLCBuYS5ybSA9IFRSVUUpCiAgICBhdmVyYWdlX05vaXN5SW5mb3JtZWQxX3BubFtpLCBuXSA8LSBtZWFuKE5vaXN5SW5mb3JtZWQxX3BubCwgbmEucm0gPSBUUlVFKQogICAgYXZlcmFnZV9Ob2lzeUluZm9ybWVkMl9wbmxbaSwgbl0gPC0gbWVhbihOb2lzeUluZm9ybWVkMl9wbmwsIG5hLnJtID0gVFJVRSkKICAgIGF2ZXJhZ2VfTm9pc3kxX3BubFtpLCBuXSA8LSBtZWFuKE5vaXN5MV9wbmwsIG5hLnJtID0gVFJVRSkKICAgIGF2ZXJhZ2VfTm9pc3kyX3BubFtpLCBuXSA8LSBtZWFuKE5vaXN5Ml9wbmwsIG5hLnJtID0gVFJVRSkKICAgIGF2ZXJhZ2VfU3RvY2hOb2lzeV9wbmxbaSwgbl0gPC0gbWVhbihTdG9jaE5vaXN5X3BubCwgbmEucm0gPSBUUlVFKQogIH0KfQoKIyBDYWxjdWxhdGUgdGhlIG92ZXJhbGwgYXZlcmFnZSBmb3IgZWFjaCBwb3NpdGlvbiBhY3Jvc3MgYWxsIHNpbXVsYXRpb25zCm92ZXJhbGxfYXZlcmFnZV9NTV9wbmwgPC0gcm93TWVhbnMoYXZlcmFnZV9NTV9wbmwsIG5hLnJtID0gVFJVRSkKb3ZlcmFsbF9hdmVyYWdlX0luZm9ybWVkX3BubCA8LSByb3dNZWFucyhhdmVyYWdlX0luZm9ybWVkX3BubCwgbmEucm0gPSBUUlVFKQpvdmVyYWxsX2F2ZXJhZ2VfTm9pc3lJbmZvcm1lZDFfcG5sIDwtIHJvd01lYW5zKGF2ZXJhZ2VfTm9pc3lJbmZvcm1lZDFfcG5sLCBuYS5ybSA9IFRSVUUpCm92ZXJhbGxfYXZlcmFnZV9Ob2lzeUluZm9ybWVkMl9wbmwgPC0gcm93TWVhbnMoYXZlcmFnZV9Ob2lzeUluZm9ybWVkMl9wbmwsIG5hLnJtID0gVFJVRSkKb3ZlcmFsbF9hdmVyYWdlX05vaXN5MV9wbmwgPC0gcm93TWVhbnMoYXZlcmFnZV9Ob2lzeTFfcG5sLCBuYS5ybSA9IFRSVUUpCm92ZXJhbGxfYXZlcmFnZV9Ob2lzeTJfcG5sIDwtIHJvd01lYW5zKGF2ZXJhZ2VfTm9pc3kyX3BubCwgbmEucm0gPSBUUlVFKQpvdmVyYWxsX2F2ZXJhZ2VfU3RvY2hOb2lzeV9wbmwgPC0gcm93TWVhbnMoYXZlcmFnZV9TdG9jaE5vaXN5X3BubCwgbmEucm0gPSBUUlVFKQoKIyBQbG90IHRoZSBvdmVyYWxsIGF2ZXJhZ2VzCnBsb3Qob3ZlcmFsbF9hdmVyYWdlX01NX3BubCwgdHlwZSA9ICJsIiwgcGNoID0gMTYsIGNvbCA9ICJibGFjayIsIG1haW4gPSAiT3ZlcmFsbCBBdmVyYWdlIFBOTCAoc2lnbWEgPSAwLjc1KSIsIHhsYWIgPSAiUG9zaXRpb24gaW4gTGlzdCIsIHlsYWIgPSAiVmFsdWUiLCB5bGltID0gYyhtaW4oYyhvdmVyYWxsX2F2ZXJhZ2VfTU1fcG5sLCBvdmVyYWxsX2F2ZXJhZ2VfSW5mb3JtZWRfcG5sLCBvdmVyYWxsX2F2ZXJhZ2VfTm9pc3lJbmZvcm1lZDFfcG5sLCBvdmVyYWxsX2F2ZXJhZ2VfTm9pc3lJbmZvcm1lZDJfcG5sLCBvdmVyYWxsX2F2ZXJhZ2VfTm9pc3kxX3BubCwgb3ZlcmFsbF9hdmVyYWdlX05vaXN5Ml9wbmwsIG92ZXJhbGxfYXZlcmFnZV9TdG9jaE5vaXN5X3BubCkpLCBtYXgoYyhvdmVyYWxsX2F2ZXJhZ2VfTU1fcG5sLCBvdmVyYWxsX2F2ZXJhZ2VfSW5mb3JtZWRfcG5sLCBvdmVyYWxsX2F2ZXJhZ2VfTm9pc3lJbmZvcm1lZDFfcG5sLCBvdmVyYWxsX2F2ZXJhZ2VfTm9pc3lJbmZvcm1lZDJfcG5sLCBvdmVyYWxsX2F2ZXJhZ2VfTm9pc3kxX3BubCwgb3ZlcmFsbF9hdmVyYWdlX05vaXN5Ml9wbmwsIG92ZXJhbGxfYXZlcmFnZV9TdG9jaE5vaXN5X3BubCkpKSkKbGluZXMob3ZlcmFsbF9hdmVyYWdlX0luZm9ybWVkX3BubCwgdHlwZSA9ICJsIiwgcGNoID0gMTYsIGNvbCA9ICJyZWQiKQpsaW5lcyhvdmVyYWxsX2F2ZXJhZ2VfTm9pc3lJbmZvcm1lZDFfcG5sLCB0eXBlID0gImwiLCBwY2ggPSAxNiwgY29sID0gImdyZWVuIikKbGluZXMob3ZlcmFsbF9hdmVyYWdlX05vaXN5SW5mb3JtZWQyX3BubCwgdHlwZSA9ICJsIiwgcGNoID0gMTYsIGNvbCA9ICJ5ZWxsb3ciKQpsaW5lcyhvdmVyYWxsX2F2ZXJhZ2VfTm9pc3kxX3BubCwgdHlwZSA9ICJsIiwgcGNoID0gMTYsIGNvbCA9ICJibHVlIikKbGluZXMob3ZlcmFsbF9hdmVyYWdlX05vaXN5Ml9wbmwsIHR5cGUgPSAibCIsIHBjaCA9IDE2LCBjb2wgPSAicHVycGxlIikKbGluZXMob3ZlcmFsbF9hdmVyYWdlX1N0b2NoTm9pc3lfcG5sLCB0eXBlID0gImwiLCBwY2ggPSAxNiwgY29sID0gIm9yYW5nZSIpCgojIEFkZCBsZWdlbmQKbGVnZW5kKCJib3R0b21sZWZ0IiwgbGVnZW5kID0gYygiTWFya2V0IE1ha2VyIiwgIkluZm9ybWVkIiwgIk5vaXN5IEluZm9ybWVkIDEiLCAiTm9pc3kgSW5mb3JtZWQgMiIsICJOb2lzeSAxIiwgIk5vaXN5IDIiLCAiU3RvY2hhc3RpYyBOb2lzeSIpLCBjb2wgPSBjKCJibGFjayIsICJyZWQiLCAiZ3JlZW4iLCAieWVsbG93IiwgImJsdWUiLCAicHVycGxlIiwgIm9yYW5nZSIpLCBsdHkgPSAxLCBjZXggPSAwLjgpCmBgYAoKCiMjIyBzZXQgNCB3aXRoIHNpZ21hID0gMQoKYGBge3J9CiMgSW5pdGlhbGl6ZSBtYXRyaWNlcyB0byBzdG9yZSBhdmVyYWdlcyBmb3IgZWFjaCBwb3NpdGlvbgphdmVyYWdlX01NX3BubCA8LSBtYXRyaXgoTkEsIG5yb3cgPSAxMDAsIG5jb2wgPSAxMCkKYXZlcmFnZV9JbmZvcm1lZF9wbmwgPC0gbWF0cml4KE5BLCBucm93ID0gMTAwLCBuY29sID0gMTApCmF2ZXJhZ2VfTm9pc3lJbmZvcm1lZDFfcG5sIDwtIG1hdHJpeChOQSwgbnJvdyA9IDEwMCwgbmNvbCA9IDEwKQphdmVyYWdlX05vaXN5SW5mb3JtZWQyX3BubCA8LSBtYXRyaXgoTkEsIG5yb3cgPSAxMDAsIG5jb2wgPSAxMCkKYXZlcmFnZV9Ob2lzeTFfcG5sIDwtIG1hdHJpeChOQSwgbnJvdyA9IDEwMCwgbmNvbCA9IDEwKQphdmVyYWdlX05vaXN5Ml9wbmwgPC0gbWF0cml4KE5BLCBucm93ID0gMTAwLCBuY29sID0gMTApCmF2ZXJhZ2VfU3RvY2hOb2lzeV9wbmwgPC0gbWF0cml4KE5BLCBucm93ID0gMTAwLCBuY29sID0gMTApCgojIExvb3AgdGhyb3VnaCBlYWNoIHNpbXVsYXRpb24gKG4pCmZvciAobiBpbiAxOjEwKSB7CgogIE1NX3BubF9zZXQ0XzEgPC0gc3Ryc3BsaXQoZ3N1YigiXFxbfFxcXSIsICIiLCB1bmxpc3QoYWdncmVnYXRlZF9yZXN1bHRzXzRfMVtuLCA2XSkpLCAiLCAiKQoKICBJbmZvcm1lZF9wbmxfc2V0NF8xIDwtIHN0cnNwbGl0KGdzdWIoIlxcW3xcXF0iLCAiIiwgdW5saXN0KGFnZ3JlZ2F0ZWRfcmVzdWx0c180XzFbbiwgOF0pKSwgIiwgIikKICAKICBOb2lzeUluZm9ybWVkMV9wbmxfc2V0NF8xIDwtIHN0cnNwbGl0KGdzdWIoIlxcW3xcXF0iLCAiIiwgdW5saXN0KGFnZ3JlZ2F0ZWRfcmVzdWx0c180XzFbbiwgMTBdKSksICIsICIpCiAgCiAgTm9pc3lJbmZvcm1lZDJfcG5sX3NldDRfMSA8LSBzdHJzcGxpdChnc3ViKCJcXFt8XFxdIiwgIiIsIHVubGlzdChhZ2dyZWdhdGVkX3Jlc3VsdHNfNF8xW24sIDEyXSkpLCAiLCAiKQogIAogIE5vaXN5MV9wbmxfc2V0NF8xIDwtIHN0cnNwbGl0KGdzdWIoIlxcW3xcXF0iLCAiIiwgdW5saXN0KGFnZ3JlZ2F0ZWRfcmVzdWx0c180XzFbbiwgMTRdKSksICIsICIpCiAgCiAgTm9pc3kyX3BubF9zZXQ0XzEgPC0gc3Ryc3BsaXQoZ3N1YigiXFxbfFxcXSIsICIiLCB1bmxpc3QoYWdncmVnYXRlZF9yZXN1bHRzXzRfMVtuLCAxNl0pKSwgIiwgIikKICAKICBTdG9jaE5vaXN5X3BubF9zZXQ0XzEgPC0gc3Ryc3BsaXQoZ3N1YigiXFxbfFxcXSIsICIiLCB1bmxpc3QoYWdncmVnYXRlZF9yZXN1bHRzXzRfMVtuLCAxOF0pKSwgIiwgIikKICAKICAjIExvb3AgdGhyb3VnaCBlYWNoIHBvc2l0aW9uIChpKQogIGZvciAoaSBpbiAxOjEwMCkgewogICAgIyBFeHRyYWN0IFRydWUgYW5kIEV4cGVjdGVkIHZhbHVlcyBmb3IgdGhlIGktdGggcG9zaXRpb24KICAgIE1NX3BubCA8LSBzYXBwbHkoTU1fcG5sX3NldDRfMSwgZnVuY3Rpb24oeCkgYXMubnVtZXJpYyh4W2ldKSkKICAgIEluZm9ybWVkX3BubCA8LSBzYXBwbHkoSW5mb3JtZWRfcG5sX3NldDRfMSwgZnVuY3Rpb24oeCkgYXMubnVtZXJpYyh4W2ldKSkKICAgIE5vaXN5SW5mb3JtZWQxX3BubCA8LSBzYXBwbHkoTm9pc3lJbmZvcm1lZDFfcG5sX3NldDRfMSwgZnVuY3Rpb24oeCkgYXMubnVtZXJpYyh4W2ldKSkKICAgIE5vaXN5SW5mb3JtZWQyX3BubCA8LSBzYXBwbHkoTm9pc3lJbmZvcm1lZDJfcG5sX3NldDRfMSwgZnVuY3Rpb24oeCkgYXMubnVtZXJpYyh4W2ldKSkKICAgIE5vaXN5MV9wbmwgPC0gc2FwcGx5KE5vaXN5MV9wbmxfc2V0NF8xLCBmdW5jdGlvbih4KSBhcy5udW1lcmljKHhbaV0pKQogICAgTm9pc3kyX3BubCA8LSBzYXBwbHkoTm9pc3kyX3BubF9zZXQ0XzEsIGZ1bmN0aW9uKHgpIGFzLm51bWVyaWMoeFtpXSkpCiAgICBTdG9jaE5vaXN5X3BubCA8LSBzYXBwbHkoU3RvY2hOb2lzeV9wbmxfc2V0NF8xLCBmdW5jdGlvbih4KSBhcy5udW1lcmljKHhbaV0pKQogICAgCiAgICAjIENhbGN1bGF0ZSB0aGUgYXZlcmFnZSBvZiBUcnVlIGFuZCBFeHBlY3RlZCB2YWx1ZXMgZm9yIHRoZSBpLXRoIHBvc2l0aW9uCiAgICBhdmVyYWdlX01NX3BubFtpLCBuXSA8LSBtZWFuKE1NX3BubCwgbmEucm0gPSBUUlVFKQogICAgYXZlcmFnZV9JbmZvcm1lZF9wbmxbaSwgbl0gPC0gbWVhbihJbmZvcm1lZF9wbmwsIG5hLnJtID0gVFJVRSkKICAgIGF2ZXJhZ2VfTm9pc3lJbmZvcm1lZDFfcG5sW2ksIG5dIDwtIG1lYW4oTm9pc3lJbmZvcm1lZDFfcG5sLCBuYS5ybSA9IFRSVUUpCiAgICBhdmVyYWdlX05vaXN5SW5mb3JtZWQyX3BubFtpLCBuXSA8LSBtZWFuKE5vaXN5SW5mb3JtZWQyX3BubCwgbmEucm0gPSBUUlVFKQogICAgYXZlcmFnZV9Ob2lzeTFfcG5sW2ksIG5dIDwtIG1lYW4oTm9pc3kxX3BubCwgbmEucm0gPSBUUlVFKQogICAgYXZlcmFnZV9Ob2lzeTJfcG5sW2ksIG5dIDwtIG1lYW4oTm9pc3kyX3BubCwgbmEucm0gPSBUUlVFKQogICAgYXZlcmFnZV9TdG9jaE5vaXN5X3BubFtpLCBuXSA8LSBtZWFuKFN0b2NoTm9pc3lfcG5sLCBuYS5ybSA9IFRSVUUpCiAgfQp9CgojIENhbGN1bGF0ZSB0aGUgb3ZlcmFsbCBhdmVyYWdlIGZvciBlYWNoIHBvc2l0aW9uIGFjcm9zcyBhbGwgc2ltdWxhdGlvbnMKb3ZlcmFsbF9hdmVyYWdlX01NX3BubCA8LSByb3dNZWFucyhhdmVyYWdlX01NX3BubCwgbmEucm0gPSBUUlVFKQpvdmVyYWxsX2F2ZXJhZ2VfSW5mb3JtZWRfcG5sIDwtIHJvd01lYW5zKGF2ZXJhZ2VfSW5mb3JtZWRfcG5sLCBuYS5ybSA9IFRSVUUpCm92ZXJhbGxfYXZlcmFnZV9Ob2lzeUluZm9ybWVkMV9wbmwgPC0gcm93TWVhbnMoYXZlcmFnZV9Ob2lzeUluZm9ybWVkMV9wbmwsIG5hLnJtID0gVFJVRSkKb3ZlcmFsbF9hdmVyYWdlX05vaXN5SW5mb3JtZWQyX3BubCA8LSByb3dNZWFucyhhdmVyYWdlX05vaXN5SW5mb3JtZWQyX3BubCwgbmEucm0gPSBUUlVFKQpvdmVyYWxsX2F2ZXJhZ2VfTm9pc3kxX3BubCA8LSByb3dNZWFucyhhdmVyYWdlX05vaXN5MV9wbmwsIG5hLnJtID0gVFJVRSkKb3ZlcmFsbF9hdmVyYWdlX05vaXN5Ml9wbmwgPC0gcm93TWVhbnMoYXZlcmFnZV9Ob2lzeTJfcG5sLCBuYS5ybSA9IFRSVUUpCm92ZXJhbGxfYXZlcmFnZV9TdG9jaE5vaXN5X3BubCA8LSByb3dNZWFucyhhdmVyYWdlX1N0b2NoTm9pc3lfcG5sLCBuYS5ybSA9IFRSVUUpCgojIFBsb3QgdGhlIG92ZXJhbGwgYXZlcmFnZXMKcGxvdChvdmVyYWxsX2F2ZXJhZ2VfTU1fcG5sLCB0eXBlID0gImwiLCBwY2ggPSAxNiwgY29sID0gImJsYWNrIiwgbWFpbiA9ICJPdmVyYWxsIEF2ZXJhZ2UgUE5MIChzaWdtYSA9IDEpIiwgeGxhYiA9ICJQb3NpdGlvbiBpbiBMaXN0IiwgeWxhYiA9ICJWYWx1ZSIsIHlsaW0gPSBjKG1pbihjKG92ZXJhbGxfYXZlcmFnZV9NTV9wbmwsIG92ZXJhbGxfYXZlcmFnZV9JbmZvcm1lZF9wbmwsIG92ZXJhbGxfYXZlcmFnZV9Ob2lzeUluZm9ybWVkMV9wbmwsIG92ZXJhbGxfYXZlcmFnZV9Ob2lzeUluZm9ybWVkMl9wbmwsIG92ZXJhbGxfYXZlcmFnZV9Ob2lzeTFfcG5sLCBvdmVyYWxsX2F2ZXJhZ2VfTm9pc3kyX3BubCwgb3ZlcmFsbF9hdmVyYWdlX1N0b2NoTm9pc3lfcG5sKSksIG1heChjKG92ZXJhbGxfYXZlcmFnZV9NTV9wbmwsIG92ZXJhbGxfYXZlcmFnZV9JbmZvcm1lZF9wbmwsIG92ZXJhbGxfYXZlcmFnZV9Ob2lzeUluZm9ybWVkMV9wbmwsIG92ZXJhbGxfYXZlcmFnZV9Ob2lzeUluZm9ybWVkMl9wbmwsIG92ZXJhbGxfYXZlcmFnZV9Ob2lzeTFfcG5sLCBvdmVyYWxsX2F2ZXJhZ2VfTm9pc3kyX3BubCwgb3ZlcmFsbF9hdmVyYWdlX1N0b2NoTm9pc3lfcG5sKSkpKQpsaW5lcyhvdmVyYWxsX2F2ZXJhZ2VfSW5mb3JtZWRfcG5sLCB0eXBlID0gImwiLCBwY2ggPSAxNiwgY29sID0gInJlZCIpCmxpbmVzKG92ZXJhbGxfYXZlcmFnZV9Ob2lzeUluZm9ybWVkMV9wbmwsIHR5cGUgPSAibCIsIHBjaCA9IDE2LCBjb2wgPSAiZ3JlZW4iKQpsaW5lcyhvdmVyYWxsX2F2ZXJhZ2VfTm9pc3lJbmZvcm1lZDJfcG5sLCB0eXBlID0gImwiLCBwY2ggPSAxNiwgY29sID0gInllbGxvdyIpCmxpbmVzKG92ZXJhbGxfYXZlcmFnZV9Ob2lzeTFfcG5sLCB0eXBlID0gImwiLCBwY2ggPSAxNiwgY29sID0gImJsdWUiKQpsaW5lcyhvdmVyYWxsX2F2ZXJhZ2VfTm9pc3kyX3BubCwgdHlwZSA9ICJsIiwgcGNoID0gMTYsIGNvbCA9ICJwdXJwbGUiKQpsaW5lcyhvdmVyYWxsX2F2ZXJhZ2VfU3RvY2hOb2lzeV9wbmwsIHR5cGUgPSAibCIsIHBjaCA9IDE2LCBjb2wgPSAib3JhbmdlIikKCiMgQWRkIGxlZ2VuZApsZWdlbmQoImJvdHRvbWxlZnQiLCBsZWdlbmQgPSBjKCJNYXJrZXQgTWFrZXIiLCAiSW5mb3JtZWQiLCAiTm9pc3kgSW5mb3JtZWQgMSIsICJOb2lzeSBJbmZvcm1lZCAyIiwgIk5vaXN5IDEiLCAiTm9pc3kgMiIsICJTdG9jaGFzdGljIE5vaXN5IiksIGNvbCA9IGMoImJsYWNrIiwgInJlZCIsICJncmVlbiIsICJ5ZWxsb3ciLCAiYmx1ZSIsICJwdXJwbGUiLCAib3JhbmdlIiksIGx0eSA9IDEsIGNleCA9IDAuOCkKYGBgCgoKIyMjIHNldCA0IHdpdGggc2lnbWEgPSAyCgpgYGB7cn0KIyBJbml0aWFsaXplIG1hdHJpY2VzIHRvIHN0b3JlIGF2ZXJhZ2VzIGZvciBlYWNoIHBvc2l0aW9uCmF2ZXJhZ2VfTU1fcG5sIDwtIG1hdHJpeChOQSwgbnJvdyA9IDEwMCwgbmNvbCA9IDEwKQphdmVyYWdlX0luZm9ybWVkX3BubCA8LSBtYXRyaXgoTkEsIG5yb3cgPSAxMDAsIG5jb2wgPSAxMCkKYXZlcmFnZV9Ob2lzeUluZm9ybWVkMV9wbmwgPC0gbWF0cml4KE5BLCBucm93ID0gMTAwLCBuY29sID0gMTApCmF2ZXJhZ2VfTm9pc3lJbmZvcm1lZDJfcG5sIDwtIG1hdHJpeChOQSwgbnJvdyA9IDEwMCwgbmNvbCA9IDEwKQphdmVyYWdlX05vaXN5MV9wbmwgPC0gbWF0cml4KE5BLCBucm93ID0gMTAwLCBuY29sID0gMTApCmF2ZXJhZ2VfTm9pc3kyX3BubCA8LSBtYXRyaXgoTkEsIG5yb3cgPSAxMDAsIG5jb2wgPSAxMCkKYXZlcmFnZV9TdG9jaE5vaXN5X3BubCA8LSBtYXRyaXgoTkEsIG5yb3cgPSAxMDAsIG5jb2wgPSAxMCkKCiMgTG9vcCB0aHJvdWdoIGVhY2ggc2ltdWxhdGlvbiAobikKZm9yIChuIGluIDE6MTApIHsKCiAgTU1fcG5sX3NldDRfMiA8LSBzdHJzcGxpdChnc3ViKCJcXFt8XFxdIiwgIiIsIHVubGlzdChhZ2dyZWdhdGVkX3Jlc3VsdHNfNF8yW24sIDZdKSksICIsICIpCgogIEluZm9ybWVkX3BubF9zZXQ0XzIgPC0gc3Ryc3BsaXQoZ3N1YigiXFxbfFxcXSIsICIiLCB1bmxpc3QoYWdncmVnYXRlZF9yZXN1bHRzXzRfMltuLCA4XSkpLCAiLCAiKQogIAogIE5vaXN5SW5mb3JtZWQxX3BubF9zZXQ0XzIgPC0gc3Ryc3BsaXQoZ3N1YigiXFxbfFxcXSIsICIiLCB1bmxpc3QoYWdncmVnYXRlZF9yZXN1bHRzXzRfMltuLCAxMF0pKSwgIiwgIikKICAKICBOb2lzeUluZm9ybWVkMl9wbmxfc2V0NF8yIDwtIHN0cnNwbGl0KGdzdWIoIlxcW3xcXF0iLCAiIiwgdW5saXN0KGFnZ3JlZ2F0ZWRfcmVzdWx0c180XzJbbiwgMTJdKSksICIsICIpCiAgCiAgTm9pc3kxX3BubF9zZXQ0XzIgPC0gc3Ryc3BsaXQoZ3N1YigiXFxbfFxcXSIsICIiLCB1bmxpc3QoYWdncmVnYXRlZF9yZXN1bHRzXzRfMltuLCAxNF0pKSwgIiwgIikKICAKICBOb2lzeTJfcG5sX3NldDRfMiA8LSBzdHJzcGxpdChnc3ViKCJcXFt8XFxdIiwgIiIsIHVubGlzdChhZ2dyZWdhdGVkX3Jlc3VsdHNfNF8yW24sIDE2XSkpLCAiLCAiKQogIAogIFN0b2NoTm9pc3lfcG5sX3NldDRfMiA8LSBzdHJzcGxpdChnc3ViKCJcXFt8XFxdIiwgIiIsIHVubGlzdChhZ2dyZWdhdGVkX3Jlc3VsdHNfNF8yW24sIDE4XSkpLCAiLCAiKQogIAogICMgTG9vcCB0aHJvdWdoIGVhY2ggcG9zaXRpb24gKGkpCiAgZm9yIChpIGluIDE6MTAwKSB7CiAgICAjIEV4dHJhY3QgVHJ1ZSBhbmQgRXhwZWN0ZWQgdmFsdWVzIGZvciB0aGUgaS10aCBwb3NpdGlvbgogICAgTU1fcG5sIDwtIHNhcHBseShNTV9wbmxfc2V0NF8yLCBmdW5jdGlvbih4KSBhcy5udW1lcmljKHhbaV0pKQogICAgSW5mb3JtZWRfcG5sIDwtIHNhcHBseShJbmZvcm1lZF9wbmxfc2V0NF8yLCBmdW5jdGlvbih4KSBhcy5udW1lcmljKHhbaV0pKQogICAgTm9pc3lJbmZvcm1lZDFfcG5sIDwtIHNhcHBseShOb2lzeUluZm9ybWVkMV9wbmxfc2V0NF8yLCBmdW5jdGlvbih4KSBhcy5udW1lcmljKHhbaV0pKQogICAgTm9pc3lJbmZvcm1lZDJfcG5sIDwtIHNhcHBseShOb2lzeUluZm9ybWVkMl9wbmxfc2V0NF8yLCBmdW5jdGlvbih4KSBhcy5udW1lcmljKHhbaV0pKQogICAgTm9pc3kxX3BubCA8LSBzYXBwbHkoTm9pc3kxX3BubF9zZXQ0XzIsIGZ1bmN0aW9uKHgpIGFzLm51bWVyaWMoeFtpXSkpCiAgICBOb2lzeTJfcG5sIDwtIHNhcHBseShOb2lzeTJfcG5sX3NldDRfMiwgZnVuY3Rpb24oeCkgYXMubnVtZXJpYyh4W2ldKSkKICAgIFN0b2NoTm9pc3lfcG5sIDwtIHNhcHBseShTdG9jaE5vaXN5X3BubF9zZXQ0XzIsIGZ1bmN0aW9uKHgpIGFzLm51bWVyaWMoeFtpXSkpCiAgICAKICAgICMgQ2FsY3VsYXRlIHRoZSBhdmVyYWdlIG9mIFRydWUgYW5kIEV4cGVjdGVkIHZhbHVlcyBmb3IgdGhlIGktdGggcG9zaXRpb24KICAgIGF2ZXJhZ2VfTU1fcG5sW2ksIG5dIDwtIG1lYW4oTU1fcG5sLCBuYS5ybSA9IFRSVUUpCiAgICBhdmVyYWdlX0luZm9ybWVkX3BubFtpLCBuXSA8LSBtZWFuKEluZm9ybWVkX3BubCwgbmEucm0gPSBUUlVFKQogICAgYXZlcmFnZV9Ob2lzeUluZm9ybWVkMV9wbmxbaSwgbl0gPC0gbWVhbihOb2lzeUluZm9ybWVkMV9wbmwsIG5hLnJtID0gVFJVRSkKICAgIGF2ZXJhZ2VfTm9pc3lJbmZvcm1lZDJfcG5sW2ksIG5dIDwtIG1lYW4oTm9pc3lJbmZvcm1lZDJfcG5sLCBuYS5ybSA9IFRSVUUpCiAgICBhdmVyYWdlX05vaXN5MV9wbmxbaSwgbl0gPC0gbWVhbihOb2lzeTFfcG5sLCBuYS5ybSA9IFRSVUUpCiAgICBhdmVyYWdlX05vaXN5Ml9wbmxbaSwgbl0gPC0gbWVhbihOb2lzeTJfcG5sLCBuYS5ybSA9IFRSVUUpCiAgICBhdmVyYWdlX1N0b2NoTm9pc3lfcG5sW2ksIG5dIDwtIG1lYW4oU3RvY2hOb2lzeV9wbmwsIG5hLnJtID0gVFJVRSkKICB9Cn0KCiMgQ2FsY3VsYXRlIHRoZSBvdmVyYWxsIGF2ZXJhZ2UgZm9yIGVhY2ggcG9zaXRpb24gYWNyb3NzIGFsbCBzaW11bGF0aW9ucwpvdmVyYWxsX2F2ZXJhZ2VfTU1fcG5sIDwtIHJvd01lYW5zKGF2ZXJhZ2VfTU1fcG5sLCBuYS5ybSA9IFRSVUUpCm92ZXJhbGxfYXZlcmFnZV9JbmZvcm1lZF9wbmwgPC0gcm93TWVhbnMoYXZlcmFnZV9JbmZvcm1lZF9wbmwsIG5hLnJtID0gVFJVRSkKb3ZlcmFsbF9hdmVyYWdlX05vaXN5SW5mb3JtZWQxX3BubCA8LSByb3dNZWFucyhhdmVyYWdlX05vaXN5SW5mb3JtZWQxX3BubCwgbmEucm0gPSBUUlVFKQpvdmVyYWxsX2F2ZXJhZ2VfTm9pc3lJbmZvcm1lZDJfcG5sIDwtIHJvd01lYW5zKGF2ZXJhZ2VfTm9pc3lJbmZvcm1lZDJfcG5sLCBuYS5ybSA9IFRSVUUpCm92ZXJhbGxfYXZlcmFnZV9Ob2lzeTFfcG5sIDwtIHJvd01lYW5zKGF2ZXJhZ2VfTm9pc3kxX3BubCwgbmEucm0gPSBUUlVFKQpvdmVyYWxsX2F2ZXJhZ2VfTm9pc3kyX3BubCA8LSByb3dNZWFucyhhdmVyYWdlX05vaXN5Ml9wbmwsIG5hLnJtID0gVFJVRSkKb3ZlcmFsbF9hdmVyYWdlX1N0b2NoTm9pc3lfcG5sIDwtIHJvd01lYW5zKGF2ZXJhZ2VfU3RvY2hOb2lzeV9wbmwsIG5hLnJtID0gVFJVRSkKCiMgUGxvdCB0aGUgb3ZlcmFsbCBhdmVyYWdlcwpwbG90KG92ZXJhbGxfYXZlcmFnZV9NTV9wbmwsIHR5cGUgPSAibCIsIHBjaCA9IDE2LCBjb2wgPSAiYmxhY2siLCBtYWluID0gIk92ZXJhbGwgQXZlcmFnZSBQTkwgKHNpZ21hID0gMikiLCB4bGFiID0gIlBvc2l0aW9uIGluIExpc3QiLCB5bGFiID0gIlZhbHVlIiwgeWxpbSA9IGMobWluKGMob3ZlcmFsbF9hdmVyYWdlX01NX3BubCwgb3ZlcmFsbF9hdmVyYWdlX0luZm9ybWVkX3BubCwgb3ZlcmFsbF9hdmVyYWdlX05vaXN5SW5mb3JtZWQxX3BubCwgb3ZlcmFsbF9hdmVyYWdlX05vaXN5SW5mb3JtZWQyX3BubCwgb3ZlcmFsbF9hdmVyYWdlX05vaXN5MV9wbmwsIG92ZXJhbGxfYXZlcmFnZV9Ob2lzeTJfcG5sLCBvdmVyYWxsX2F2ZXJhZ2VfU3RvY2hOb2lzeV9wbmwpKSwgbWF4KGMob3ZlcmFsbF9hdmVyYWdlX01NX3BubCwgb3ZlcmFsbF9hdmVyYWdlX0luZm9ybWVkX3BubCwgb3ZlcmFsbF9hdmVyYWdlX05vaXN5SW5mb3JtZWQxX3BubCwgb3ZlcmFsbF9hdmVyYWdlX05vaXN5SW5mb3JtZWQyX3BubCwgb3ZlcmFsbF9hdmVyYWdlX05vaXN5MV9wbmwsIG92ZXJhbGxfYXZlcmFnZV9Ob2lzeTJfcG5sLCBvdmVyYWxsX2F2ZXJhZ2VfU3RvY2hOb2lzeV9wbmwpKSkpCmxpbmVzKG92ZXJhbGxfYXZlcmFnZV9JbmZvcm1lZF9wbmwsIHR5cGUgPSAibCIsIHBjaCA9IDE2LCBjb2wgPSAicmVkIikKbGluZXMob3ZlcmFsbF9hdmVyYWdlX05vaXN5SW5mb3JtZWQxX3BubCwgdHlwZSA9ICJsIiwgcGNoID0gMTYsIGNvbCA9ICJncmVlbiIpCmxpbmVzKG92ZXJhbGxfYXZlcmFnZV9Ob2lzeUluZm9ybWVkMl9wbmwsIHR5cGUgPSAibCIsIHBjaCA9IDE2LCBjb2wgPSAieWVsbG93IikKbGluZXMob3ZlcmFsbF9hdmVyYWdlX05vaXN5MV9wbmwsIHR5cGUgPSAibCIsIHBjaCA9IDE2LCBjb2wgPSAiYmx1ZSIpCmxpbmVzKG92ZXJhbGxfYXZlcmFnZV9Ob2lzeTJfcG5sLCB0eXBlID0gImwiLCBwY2ggPSAxNiwgY29sID0gInB1cnBsZSIpCmxpbmVzKG92ZXJhbGxfYXZlcmFnZV9TdG9jaE5vaXN5X3BubCwgdHlwZSA9ICJsIiwgcGNoID0gMTYsIGNvbCA9ICJvcmFuZ2UiKQoKIyBBZGQgbGVnZW5kCmxlZ2VuZCgiYm90dG9tbGVmdCIsIGxlZ2VuZCA9IGMoIk1hcmtldCBNYWtlciIsICJJbmZvcm1lZCIsICJOb2lzeSBJbmZvcm1lZCAxIiwgIk5vaXN5IEluZm9ybWVkIDIiLCAiTm9pc3kgMSIsICJOb2lzeSAyIiwgIlN0b2NoYXN0aWMgTm9pc3kiKSwgY29sID0gYygiYmxhY2siLCAicmVkIiwgImdyZWVuIiwgInllbGxvdyIsICJibHVlIiwgInB1cnBsZSIsICJvcmFuZ2UiKSwgbHR5ID0gMSwgY2V4ID0gMC44KQpgYGAKCgojIyMgc2V0IDQgd2l0aCBzaWdtYSA9IDUKCmBgYHtyfQojIEluaXRpYWxpemUgbWF0cmljZXMgdG8gc3RvcmUgYXZlcmFnZXMgZm9yIGVhY2ggcG9zaXRpb24KYXZlcmFnZV9NTV9wbmwgPC0gbWF0cml4KE5BLCBucm93ID0gMTAwLCBuY29sID0gMTApCmF2ZXJhZ2VfSW5mb3JtZWRfcG5sIDwtIG1hdHJpeChOQSwgbnJvdyA9IDEwMCwgbmNvbCA9IDEwKQphdmVyYWdlX05vaXN5SW5mb3JtZWQxX3BubCA8LSBtYXRyaXgoTkEsIG5yb3cgPSAxMDAsIG5jb2wgPSAxMCkKYXZlcmFnZV9Ob2lzeUluZm9ybWVkMl9wbmwgPC0gbWF0cml4KE5BLCBucm93ID0gMTAwLCBuY29sID0gMTApCmF2ZXJhZ2VfTm9pc3kxX3BubCA8LSBtYXRyaXgoTkEsIG5yb3cgPSAxMDAsIG5jb2wgPSAxMCkKYXZlcmFnZV9Ob2lzeTJfcG5sIDwtIG1hdHJpeChOQSwgbnJvdyA9IDEwMCwgbmNvbCA9IDEwKQphdmVyYWdlX1N0b2NoTm9pc3lfcG5sIDwtIG1hdHJpeChOQSwgbnJvdyA9IDEwMCwgbmNvbCA9IDEwKQoKIyBMb29wIHRocm91Z2ggZWFjaCBzaW11bGF0aW9uIChuKQpmb3IgKG4gaW4gMToxMCkgewoKICBNTV9wbmxfc2V0NF81IDwtIHN0cnNwbGl0KGdzdWIoIlxcW3xcXF0iLCAiIiwgdW5saXN0KGFnZ3JlZ2F0ZWRfcmVzdWx0c180XzVbbiwgNl0pKSwgIiwgIikKCiAgSW5mb3JtZWRfcG5sX3NldDRfNSA8LSBzdHJzcGxpdChnc3ViKCJcXFt8XFxdIiwgIiIsIHVubGlzdChhZ2dyZWdhdGVkX3Jlc3VsdHNfNF81W24sIDhdKSksICIsICIpCiAgCiAgTm9pc3lJbmZvcm1lZDFfcG5sX3NldDRfNSA8LSBzdHJzcGxpdChnc3ViKCJcXFt8XFxdIiwgIiIsIHVubGlzdChhZ2dyZWdhdGVkX3Jlc3VsdHNfNF81W24sIDEwXSkpLCAiLCAiKQogIAogIE5vaXN5SW5mb3JtZWQyX3BubF9zZXQ0XzUgPC0gc3Ryc3BsaXQoZ3N1YigiXFxbfFxcXSIsICIiLCB1bmxpc3QoYWdncmVnYXRlZF9yZXN1bHRzXzRfNVtuLCAxMl0pKSwgIiwgIikKICAKICBOb2lzeTFfcG5sX3NldDRfNSA8LSBzdHJzcGxpdChnc3ViKCJcXFt8XFxdIiwgIiIsIHVubGlzdChhZ2dyZWdhdGVkX3Jlc3VsdHNfNF81W24sIDE0XSkpLCAiLCAiKQogIAogIE5vaXN5Ml9wbmxfc2V0NF81IDwtIHN0cnNwbGl0KGdzdWIoIlxcW3xcXF0iLCAiIiwgdW5saXN0KGFnZ3JlZ2F0ZWRfcmVzdWx0c180XzVbbiwgMTZdKSksICIsICIpCiAgCiAgU3RvY2hOb2lzeV9wbmxfc2V0NF81IDwtIHN0cnNwbGl0KGdzdWIoIlxcW3xcXF0iLCAiIiwgdW5saXN0KGFnZ3JlZ2F0ZWRfcmVzdWx0c180XzVbbiwgMThdKSksICIsICIpCiAgCiAgIyBMb29wIHRocm91Z2ggZWFjaCBwb3NpdGlvbiAoaSkKICBmb3IgKGkgaW4gMToxMDApIHsKICAgICMgRXh0cmFjdCBUcnVlIGFuZCBFeHBlY3RlZCB2YWx1ZXMgZm9yIHRoZSBpLXRoIHBvc2l0aW9uCiAgICBNTV9wbmwgPC0gc2FwcGx5KE1NX3BubF9zZXQ0XzUsIGZ1bmN0aW9uKHgpIGFzLm51bWVyaWMoeFtpXSkpCiAgICBJbmZvcm1lZF9wbmwgPC0gc2FwcGx5KEluZm9ybWVkX3BubF9zZXQ0XzUsIGZ1bmN0aW9uKHgpIGFzLm51bWVyaWMoeFtpXSkpCiAgICBOb2lzeUluZm9ybWVkMV9wbmwgPC0gc2FwcGx5KE5vaXN5SW5mb3JtZWQxX3BubF9zZXQ0XzUsIGZ1bmN0aW9uKHgpIGFzLm51bWVyaWMoeFtpXSkpCiAgICBOb2lzeUluZm9ybWVkMl9wbmwgPC0gc2FwcGx5KE5vaXN5SW5mb3JtZWQyX3BubF9zZXQ0XzUsIGZ1bmN0aW9uKHgpIGFzLm51bWVyaWMoeFtpXSkpCiAgICBOb2lzeTFfcG5sIDwtIHNhcHBseShOb2lzeTFfcG5sX3NldDRfNSwgZnVuY3Rpb24oeCkgYXMubnVtZXJpYyh4W2ldKSkKICAgIE5vaXN5Ml9wbmwgPC0gc2FwcGx5KE5vaXN5Ml9wbmxfc2V0NF81LCBmdW5jdGlvbih4KSBhcy5udW1lcmljKHhbaV0pKQogICAgU3RvY2hOb2lzeV9wbmwgPC0gc2FwcGx5KFN0b2NoTm9pc3lfcG5sX3NldDRfNSwgZnVuY3Rpb24oeCkgYXMubnVtZXJpYyh4W2ldKSkKICAgIAogICAgIyBDYWxjdWxhdGUgdGhlIGF2ZXJhZ2Ugb2YgVHJ1ZSBhbmQgRXhwZWN0ZWQgdmFsdWVzIGZvciB0aGUgaS10aCBwb3NpdGlvbgogICAgYXZlcmFnZV9NTV9wbmxbaSwgbl0gPC0gbWVhbihNTV9wbmwsIG5hLnJtID0gVFJVRSkKICAgIGF2ZXJhZ2VfSW5mb3JtZWRfcG5sW2ksIG5dIDwtIG1lYW4oSW5mb3JtZWRfcG5sLCBuYS5ybSA9IFRSVUUpCiAgICBhdmVyYWdlX05vaXN5SW5mb3JtZWQxX3BubFtpLCBuXSA8LSBtZWFuKE5vaXN5SW5mb3JtZWQxX3BubCwgbmEucm0gPSBUUlVFKQogICAgYXZlcmFnZV9Ob2lzeUluZm9ybWVkMl9wbmxbaSwgbl0gPC0gbWVhbihOb2lzeUluZm9ybWVkMl9wbmwsIG5hLnJtID0gVFJVRSkKICAgIGF2ZXJhZ2VfTm9pc3kxX3BubFtpLCBuXSA8LSBtZWFuKE5vaXN5MV9wbmwsIG5hLnJtID0gVFJVRSkKICAgIGF2ZXJhZ2VfTm9pc3kyX3BubFtpLCBuXSA8LSBtZWFuKE5vaXN5Ml9wbmwsIG5hLnJtID0gVFJVRSkKICAgIGF2ZXJhZ2VfU3RvY2hOb2lzeV9wbmxbaSwgbl0gPC0gbWVhbihTdG9jaE5vaXN5X3BubCwgbmEucm0gPSBUUlVFKQogIH0KfQoKIyBDYWxjdWxhdGUgdGhlIG92ZXJhbGwgYXZlcmFnZSBmb3IgZWFjaCBwb3NpdGlvbiBhY3Jvc3MgYWxsIHNpbXVsYXRpb25zCm92ZXJhbGxfYXZlcmFnZV9NTV9wbmwgPC0gcm93TWVhbnMoYXZlcmFnZV9NTV9wbmwsIG5hLnJtID0gVFJVRSkKb3ZlcmFsbF9hdmVyYWdlX0luZm9ybWVkX3BubCA8LSByb3dNZWFucyhhdmVyYWdlX0luZm9ybWVkX3BubCwgbmEucm0gPSBUUlVFKQpvdmVyYWxsX2F2ZXJhZ2VfTm9pc3lJbmZvcm1lZDFfcG5sIDwtIHJvd01lYW5zKGF2ZXJhZ2VfTm9pc3lJbmZvcm1lZDFfcG5sLCBuYS5ybSA9IFRSVUUpCm92ZXJhbGxfYXZlcmFnZV9Ob2lzeUluZm9ybWVkMl9wbmwgPC0gcm93TWVhbnMoYXZlcmFnZV9Ob2lzeUluZm9ybWVkMl9wbmwsIG5hLnJtID0gVFJVRSkKb3ZlcmFsbF9hdmVyYWdlX05vaXN5MV9wbmwgPC0gcm93TWVhbnMoYXZlcmFnZV9Ob2lzeTFfcG5sLCBuYS5ybSA9IFRSVUUpCm92ZXJhbGxfYXZlcmFnZV9Ob2lzeTJfcG5sIDwtIHJvd01lYW5zKGF2ZXJhZ2VfTm9pc3kyX3BubCwgbmEucm0gPSBUUlVFKQpvdmVyYWxsX2F2ZXJhZ2VfU3RvY2hOb2lzeV9wbmwgPC0gcm93TWVhbnMoYXZlcmFnZV9TdG9jaE5vaXN5X3BubCwgbmEucm0gPSBUUlVFKQoKIyBQbG90IHRoZSBvdmVyYWxsIGF2ZXJhZ2VzCnBsb3Qob3ZlcmFsbF9hdmVyYWdlX01NX3BubCwgdHlwZSA9ICJsIiwgcGNoID0gMTYsIGNvbCA9ICJibGFjayIsIG1haW4gPSAiT3ZlcmFsbCBBdmVyYWdlIFBOTCAoc2lnbWEgPSA1KSIsIHhsYWIgPSAiUG9zaXRpb24gaW4gTGlzdCIsIHlsYWIgPSAiVmFsdWUiLCB5bGltID0gYyhtaW4oYyhvdmVyYWxsX2F2ZXJhZ2VfTU1fcG5sLCBvdmVyYWxsX2F2ZXJhZ2VfSW5mb3JtZWRfcG5sLCBvdmVyYWxsX2F2ZXJhZ2VfTm9pc3lJbmZvcm1lZDFfcG5sLCBvdmVyYWxsX2F2ZXJhZ2VfTm9pc3lJbmZvcm1lZDJfcG5sLCBvdmVyYWxsX2F2ZXJhZ2VfTm9pc3kxX3BubCwgb3ZlcmFsbF9hdmVyYWdlX05vaXN5Ml9wbmwsIG92ZXJhbGxfYXZlcmFnZV9TdG9jaE5vaXN5X3BubCkpLCBtYXgoYyhvdmVyYWxsX2F2ZXJhZ2VfTU1fcG5sLCBvdmVyYWxsX2F2ZXJhZ2VfSW5mb3JtZWRfcG5sLCBvdmVyYWxsX2F2ZXJhZ2VfTm9pc3lJbmZvcm1lZDFfcG5sLCBvdmVyYWxsX2F2ZXJhZ2VfTm9pc3lJbmZvcm1lZDJfcG5sLCBvdmVyYWxsX2F2ZXJhZ2VfTm9pc3kxX3BubCwgb3ZlcmFsbF9hdmVyYWdlX05vaXN5Ml9wbmwsIG92ZXJhbGxfYXZlcmFnZV9TdG9jaE5vaXN5X3BubCkpKSkKbGluZXMob3ZlcmFsbF9hdmVyYWdlX0luZm9ybWVkX3BubCwgdHlwZSA9ICJsIiwgcGNoID0gMTYsIGNvbCA9ICJyZWQiKQpsaW5lcyhvdmVyYWxsX2F2ZXJhZ2VfTm9pc3lJbmZvcm1lZDFfcG5sLCB0eXBlID0gImwiLCBwY2ggPSAxNiwgY29sID0gImdyZWVuIikKbGluZXMob3ZlcmFsbF9hdmVyYWdlX05vaXN5SW5mb3JtZWQyX3BubCwgdHlwZSA9ICJsIiwgcGNoID0gMTYsIGNvbCA9ICJ5ZWxsb3ciKQpsaW5lcyhvdmVyYWxsX2F2ZXJhZ2VfTm9pc3kxX3BubCwgdHlwZSA9ICJsIiwgcGNoID0gMTYsIGNvbCA9ICJibHVlIikKbGluZXMob3ZlcmFsbF9hdmVyYWdlX05vaXN5Ml9wbmwsIHR5cGUgPSAibCIsIHBjaCA9IDE2LCBjb2wgPSAicHVycGxlIikKbGluZXMob3ZlcmFsbF9hdmVyYWdlX1N0b2NoTm9pc3lfcG5sLCB0eXBlID0gImwiLCBwY2ggPSAxNiwgY29sID0gIm9yYW5nZSIpCgojIEFkZCBsZWdlbmQKbGVnZW5kKCJib3R0b21sZWZ0IiwgbGVnZW5kID0gYygiTWFya2V0IE1ha2VyIiwgIkluZm9ybWVkIiwgIk5vaXN5IEluZm9ybWVkIDEiLCAiTm9pc3kgSW5mb3JtZWQgMiIsICJOb2lzeSAxIiwgIk5vaXN5IDIiLCAiU3RvY2hhc3RpYyBOb2lzeSIpLCBjb2wgPSBjKCJibGFjayIsICJyZWQiLCAiZ3JlZW4iLCAieWVsbG93IiwgImJsdWUiLCAicHVycGxlIiwgIm9yYW5nZSIpLCBsdHkgPSAxLCBjZXggPSAwLjgpCmBgYAoKCmBgYHtyfQpNTV9wbmxfc2V0NF81IDwtIHN0cnNwbGl0KGdzdWIoIlxcW3xcXF0iLCAiIiwgdW5saXN0KGFnZ3JlZ2F0ZWRfcmVzdWx0c180XzVbNCwgNl0pKSwgIiwgIilbWzFdXQpJbmZvcm1lZF9wbmxfc2V0NF81IDwtIHN0cnNwbGl0KGdzdWIoIlxcW3xcXF0iLCAiIiwgdW5saXN0KGFnZ3JlZ2F0ZWRfcmVzdWx0c180XzVbNCwgOF0pKSwgIiwgIilbWzFdXQpOb2lzeUluZm9ybWVkMV9wbmxfc2V0NF81IDwtIHN0cnNwbGl0KGdzdWIoIlxcW3xcXF0iLCAiIiwgdW5saXN0KGFnZ3JlZ2F0ZWRfcmVzdWx0c180XzVbNCwgMTBdKSksICIsICIpW1sxXV0KTm9pc3lJbmZvcm1lZDJfcG5sX3NldDRfNSA8LSBzdHJzcGxpdChnc3ViKCJcXFt8XFxdIiwgIiIsIHVubGlzdChhZ2dyZWdhdGVkX3Jlc3VsdHNfNF81WzQsIDEyXSkpLCAiLCAiKVtbMV1dCk5vaXN5MV9wbmxfc2V0NF81IDwtIHN0cnNwbGl0KGdzdWIoIlxcW3xcXF0iLCAiIiwgdW5saXN0KGFnZ3JlZ2F0ZWRfcmVzdWx0c180XzVbNCwgMTRdKSksICIsICIpW1sxXV0KTm9pc3kyX3BubF9zZXQ0XzUgPC0gc3Ryc3BsaXQoZ3N1YigiXFxbfFxcXSIsICIiLCB1bmxpc3QoYWdncmVnYXRlZF9yZXN1bHRzXzRfNVs0LCAxNl0pKSwgIiwgIilbWzFdXQpTdG9jaE5vaXN5X3BubF9zZXQ0XzUgPC0gc3Ryc3BsaXQoZ3N1YigiXFxbfFxcXSIsICIiLCB1bmxpc3QoYWdncmVnYXRlZF9yZXN1bHRzXzRfNVs0LCAxOF0pKSwgIiwgIilbWzFdXQoKI0JpZHNfc2V0MSA8LSBzdHJzcGxpdChnc3ViKCJcXFt8XFxdIiwgIiIsIHVubGlzdChhZ2dyZWdhdGVkX3Jlc3VsdHNfMVs1LCA0XSkpLCAiLCAiKVtbMV1dCiNBc2tzX3NldDEgPC0gc3Ryc3BsaXQoZ3N1YigiXFxbfFxcXSIsICIiLCB1bmxpc3QoYWdncmVnYXRlZF9yZXN1bHRzXzFbNSwgNV0pKSwgIiwgIilbWzFdXQoKcGxvdChNTV9wbmxfc2V0NF81LCAKICAgICB0eXBlID0gImwiLCAKICAgICBwY2ggPSAxNiwgCiAgICAgY29sID0gImJsYWNrIiwgCiAgICAgbWFpbiA9ICJQTkwgU2ltdWxhdGlvbiA0IiwgCiAgICAgeGxhYiA9ICJQb3NpdGlvbiBpbiBMaXN0IiwgCiAgICAgeWxhYiA9ICJWYWx1ZSIsCiAgICAgeWxpbSA9IGMobWluKGMoYXMubnVtZXJpYyhNTV9wbmxfc2V0NF81KSwgYXMubnVtZXJpYyhJbmZvcm1lZF9wbmxfc2V0NF81KSwgYXMubnVtZXJpYyhOb2lzeUluZm9ybWVkMV9wbmxfc2V0NF81KSwgYXMubnVtZXJpYyhOb2lzeUluZm9ybWVkMl9wbmxfc2V0NF81KSwgYXMubnVtZXJpYyhOb2lzeTFfcG5sX3NldDRfNSksIGFzLm51bWVyaWMoTm9pc3kyX3BubF9zZXQ0XzUpLCBhcy5udW1lcmljKFN0b2NoTm9pc3lfcG5sX3NldDRfNSkpKSwgCiAgICAgICAgICAgICAgbWF4KGMoYXMubnVtZXJpYyhNTV9wbmxfc2V0NF81KSwgYXMubnVtZXJpYyhJbmZvcm1lZF9wbmxfc2V0NF81KSwgYXMubnVtZXJpYyhOb2lzeUluZm9ybWVkMV9wbmxfc2V0NF81KSwgYXMubnVtZXJpYyhOb2lzeUluZm9ybWVkMl9wbmxfc2V0NF81KSwgYXMubnVtZXJpYyhOb2lzeTFfcG5sX3NldDRfNSksIGFzLm51bWVyaWMoTm9pc3kyX3BubF9zZXQ0XzUpLCBhcy5udW1lcmljKFN0b2NoTm9pc3lfcG5sX3NldDRfNSkpKSkpCgpsaW5lcyhJbmZvcm1lZF9wbmxfc2V0NF81LCB0eXBlID0gImwiLCBwY2ggPSAxNiwgY29sID0gInJlZCIpCmxpbmVzKE5vaXN5SW5mb3JtZWQxX3BubF9zZXQ0XzUsIHR5cGUgPSAibCIsIHBjaCA9IDE2LCBjb2wgPSAiZ3JlZW4iKQpsaW5lcyhOb2lzeUluZm9ybWVkMl9wbmxfc2V0NF81LCB0eXBlID0gImwiLCBwY2ggPSAxNiwgY29sID0gInllbGxvdyIpCmxpbmVzKE5vaXN5MV9wbmxfc2V0NF81LCB0eXBlID0gImwiLCBwY2ggPSAxNiwgY29sID0gImJsdWUiKQpsaW5lcyhOb2lzeTJfcG5sX3NldDRfNSwgdHlwZSA9ICJsIiwgcGNoID0gMTYsIGNvbCA9ICJwdXJwbGUiKQpsaW5lcyhTdG9jaE5vaXN5X3BubF9zZXQ0XzUsIHR5cGUgPSAibCIsIHBjaCA9IDE2LCBjb2wgPSAib3JhbmdlIikKCiMgQWRkIGxlZ2VuZApsZWdlbmQoImJvdHRvbWxlZnQiLCBsZWdlbmQgPSBjKCJNYXJrZXQgTWFrZXIiLCAiSW5mb3JtZWQiLCAiTm9pc3kgSW5mb3JtZWQgMSIsICJOb2lzeSBJbmZvcm1lZCAyIiwgIk5vaXN5IDEiLCAiTm9pc3kgMiIsICJTdG9jaGFzdGljIE5vaXN5IiksIGNvbCA9IGMoImJsYWNrIiwgInJlZCIsICJncmVlbiIsICJ5ZWxsb3ciLCAiYmx1ZSIsICJwdXJwbGUiLCAib3JhbmdlIiksIGx0eSA9IDEsIGNleCA9IDAuOCkKYGBgCgoKCiMjIHNldCA1IChOb2lzeSo2KQoKYGBge3J9CiMgSW5pdGlhbGl6ZSBtYXRyaWNlcyB0byBzdG9yZSBhdmVyYWdlcyBmb3IgZWFjaCBwb3NpdGlvbgphdmVyYWdlX3RydWUgPC0gbWF0cml4KE5BLCBucm93ID0gMTAwLCBuY29sID0gMTApCmF2ZXJhZ2VfZXhwZWN0ZWQgPC0gbWF0cml4KE5BLCBucm93ID0gMTAwLCBuY29sID0gMTApCgojIExvb3AgdGhyb3VnaCBlYWNoIHNpbXVsYXRpb24gKG4pCmZvciAobiBpbiAxOjEwKSB7CiAgIyBFeHRyYWN0IFRydWUgdmFsdWVzIGZyb20gdGhlIGFnZ3JlZ2F0ZWRfcmVzdWx0c180IGRhdGFmcmFtZQogIFRydWVWYWx1ZXNfc2V0NSA8LSBzdHJzcGxpdChnc3ViKCJcXFt8XFxdIiwgIiIsIHVubGlzdChhZ2dyZWdhdGVkX3Jlc3VsdHNfNVtuLCAyXSkpLCAiLCAiKQogIAogICMgRXh0cmFjdCBFeHBlY3RlZCB2YWx1ZXMgZnJvbSB0aGUgYWdncmVnYXRlZF9yZXN1bHRzXzQgZGF0YWZyYW1lCiAgRXhwZWN0ZWRWYWx1ZXNfc2V0NSA8LSBzdHJzcGxpdChnc3ViKCJcXFt8XFxdIiwgIiIsIHVubGlzdChhZ2dyZWdhdGVkX3Jlc3VsdHNfNFtuLCAzXSkpLCAiLCAiKQogIAogICMgTG9vcCB0aHJvdWdoIGVhY2ggcG9zaXRpb24gKGkpCiAgZm9yIChpIGluIDE6MTAwKSB7CiAgICAjIEV4dHJhY3QgVHJ1ZSBhbmQgRXhwZWN0ZWQgdmFsdWVzIGZvciB0aGUgaS10aCBwb3NpdGlvbgogICAgVHJ1ZV92YWx1ZXMgPC0gc2FwcGx5KFRydWVWYWx1ZXNfc2V0NSwgZnVuY3Rpb24oeCkgYXMubnVtZXJpYyh4W2ldKSkKICAgIEV4cGVjdGVkX3ZhbHVlcyA8LSBzYXBwbHkoRXhwZWN0ZWRWYWx1ZXNfc2V0NSwgZnVuY3Rpb24oeCkgYXMubnVtZXJpYyh4W2ldKSkKICAgIAogICAgIyBDYWxjdWxhdGUgdGhlIGF2ZXJhZ2Ugb2YgVHJ1ZSBhbmQgRXhwZWN0ZWQgdmFsdWVzIGZvciB0aGUgaS10aCBwb3NpdGlvbgogICAgYXZlcmFnZV90cnVlW2ksIG5dIDwtIG1lYW4oVHJ1ZV92YWx1ZXMsIG5hLnJtID0gVFJVRSkKICAgIGF2ZXJhZ2VfZXhwZWN0ZWRbaSwgbl0gPC0gbWVhbihFeHBlY3RlZF92YWx1ZXMsIG5hLnJtID0gVFJVRSkKICB9Cn0KCiMgQ2FsY3VsYXRlIHRoZSBvdmVyYWxsIGF2ZXJhZ2UgZm9yIGVhY2ggcG9zaXRpb24gYWNyb3NzIGFsbCBzaW11bGF0aW9ucwpvdmVyYWxsX2F2ZXJhZ2VfdHJ1ZSA8LSByb3dNZWFucyhhdmVyYWdlX3RydWUsIG5hLnJtID0gVFJVRSkKb3ZlcmFsbF9hdmVyYWdlX2V4cGVjdGVkIDwtIHJvd01lYW5zKGF2ZXJhZ2VfZXhwZWN0ZWQsIG5hLnJtID0gVFJVRSkKCiMgUGxvdCB0aGUgb3ZlcmFsbCBhdmVyYWdlcwpwbG90KG92ZXJhbGxfYXZlcmFnZV90cnVlLCB0eXBlID0gImwiLCBwY2ggPSAxNiwgY29sID0gImJsdWUiLCBtYWluID0gIk92ZXJhbGwgQXZlcmFnZSBvZiBUcnVlIHZzIEV4cGVjdGVkIFZhbHVlcyIsIHhsYWIgPSAiUG9zaXRpb24gaW4gTGlzdCIsIHlsYWIgPSAiVmFsdWUiLCB5bGltID0gYyhtaW4oYyhvdmVyYWxsX2F2ZXJhZ2VfdHJ1ZSwgb3ZlcmFsbF9hdmVyYWdlX2V4cGVjdGVkKSksIG1heChjKG92ZXJhbGxfYXZlcmFnZV90cnVlLCBvdmVyYWxsX2F2ZXJhZ2VfZXhwZWN0ZWQpKSkpCmxpbmVzKG92ZXJhbGxfYXZlcmFnZV9leHBlY3RlZCwgdHlwZSA9ICJsIiwgcGNoID0gMTYsIGNvbCA9ICJyZWQiKQpsZWdlbmQoInRvcHJpZ2h0IiwgbGVnZW5kID0gYygiVHJ1ZSBWYWx1ZXMiLCAiRXhwZWN0ZWQgVmFsdWVzIiksIGNvbCA9IGMoImJsdWUiLCAicmVkIiksIGx0eSA9IDEsIGNleCA9IDAuOCkKYGBgCgoKYGBge3J9CiMgSW5pdGlhbGl6ZSBtYXRyaWNlcyB0byBzdG9yZSBhdmVyYWdlcyBmb3IgZWFjaCBwb3NpdGlvbgphdmVyYWdlX2JpZCA8LSBtYXRyaXgoTkEsIG5yb3cgPSAxMDAsIG5jb2wgPSAxMCkKYXZlcmFnZV9hc2sgPC0gbWF0cml4KE5BLCBucm93ID0gMTAwLCBuY29sID0gMTApCgojIExvb3AgdGhyb3VnaCBlYWNoIHNpbXVsYXRpb24gKG4pCmZvciAobiBpbiAxOjEwKSB7CiAgIyBFeHRyYWN0IFRydWUgdmFsdWVzIGZyb20gdGhlIGFnZ3JlZ2F0ZWRfcmVzdWx0c180IGRhdGFmcmFtZQogIEJpZHNfc2V0NSA8LSBzdHJzcGxpdChnc3ViKCJcXFt8XFxdIiwgIiIsIHVubGlzdChhZ2dyZWdhdGVkX3Jlc3VsdHNfNVtuLCA0XSkpLCAiLCAiKQogIAogICMgRXh0cmFjdCBFeHBlY3RlZCB2YWx1ZXMgZnJvbSB0aGUgYWdncmVnYXRlZF9yZXN1bHRzXzQgZGF0YWZyYW1lCiAgQXNrc19zZXQ1IDwtIHN0cnNwbGl0KGdzdWIoIlxcW3xcXF0iLCAiIiwgdW5saXN0KGFnZ3JlZ2F0ZWRfcmVzdWx0c181W24sIDVdKSksICIsICIpCiAgCiAgIyBMb29wIHRocm91Z2ggZWFjaCBwb3NpdGlvbiAoaSkKICBmb3IgKGkgaW4gMToxMDApIHsKICAgICMgRXh0cmFjdCBUcnVlIGFuZCBFeHBlY3RlZCB2YWx1ZXMgZm9yIHRoZSBpLXRoIHBvc2l0aW9uCiAgICBCaWRzIDwtIHNhcHBseShCaWRzX3NldDUsIGZ1bmN0aW9uKHgpIGFzLm51bWVyaWMoeFtpXSkpCiAgICBBc2tzIDwtIHNhcHBseShBc2tzX3NldDUsIGZ1bmN0aW9uKHgpIGFzLm51bWVyaWMoeFtpXSkpCiAgICAKICAgICMgQ2FsY3VsYXRlIHRoZSBhdmVyYWdlIG9mIFRydWUgYW5kIEV4cGVjdGVkIHZhbHVlcyBmb3IgdGhlIGktdGggcG9zaXRpb24KICAgIGF2ZXJhZ2VfYmlkW2ksIG5dIDwtIG1lYW4oQmlkcywgbmEucm0gPSBUUlVFKQogICAgYXZlcmFnZV9hc2tbaSwgbl0gPC0gbWVhbihBc2tzLCBuYS5ybSA9IFRSVUUpCiAgfQp9CgojIENhbGN1bGF0ZSB0aGUgb3ZlcmFsbCBhdmVyYWdlIGZvciBlYWNoIHBvc2l0aW9uIGFjcm9zcyBhbGwgc2ltdWxhdGlvbnMKb3ZlcmFsbF9hdmVyYWdlX2JpZCA8LSByb3dNZWFucyhhdmVyYWdlX2JpZCwgbmEucm0gPSBUUlVFKQpvdmVyYWxsX2F2ZXJhZ2VfYXNrIDwtIHJvd01lYW5zKGF2ZXJhZ2VfYXNrLCBuYS5ybSA9IFRSVUUpCgojIFBsb3QgdGhlIG92ZXJhbGwgYXZlcmFnZXMKcGxvdChvdmVyYWxsX2F2ZXJhZ2VfYmlkLCB0eXBlID0gImwiLCBwY2ggPSAxNiwgY29sID0gImJsdWUiLCBtYWluID0gIk92ZXJhbGwgQXZlcmFnZSBvZiBCaWRzIHZzIEFza3MiLCB4bGFiID0gIlBvc2l0aW9uIGluIExpc3QiLCB5bGFiID0gIlZhbHVlIiwgeWxpbSA9IGMobWluKGMob3ZlcmFsbF9hdmVyYWdlX2JpZCwgb3ZlcmFsbF9hdmVyYWdlX2FzaykpLCBtYXgoYyhvdmVyYWxsX2F2ZXJhZ2VfYmlkLCBvdmVyYWxsX2F2ZXJhZ2VfYXNrKSkpKQpsaW5lcyhvdmVyYWxsX2F2ZXJhZ2VfYXNrLCB0eXBlID0gImwiLCBwY2ggPSAxNiwgY29sID0gInJlZCIpCmxlZ2VuZCgidG9wcmlnaHQiLCBsZWdlbmQgPSBjKCJCaWRzIiwgIkFza3MiKSwgY29sID0gYygiYmx1ZSIsICJyZWQiKSwgbHR5ID0gMSwgY2V4ID0gMC44KQpgYGAKCmBgYHtyfQojIEluaXRpYWxpemUgbWF0cmljZXMgdG8gc3RvcmUgYXZlcmFnZXMgZm9yIGVhY2ggcG9zaXRpb24KYXZlcmFnZV9iaWQgPC0gbWF0cml4KE5BLCBucm93ID0gMTAwLCBuY29sID0gMTApCmF2ZXJhZ2VfYXNrIDwtIG1hdHJpeChOQSwgbnJvdyA9IDEwMCwgbmNvbCA9IDEwKQoKIyBMb29wIHRocm91Z2ggZWFjaCBzaW11bGF0aW9uIChuKQpmb3IgKG4gaW4gMToxMCkgewogICMgRXh0cmFjdCBUcnVlIHZhbHVlcyBmcm9tIHRoZSBhZ2dyZWdhdGVkX3Jlc3VsdHNfNCBkYXRhZnJhbWUKICBCaWRzX3NldDUgPC0gc3Ryc3BsaXQoZ3N1YigiXFxbfFxcXSIsICIiLCB1bmxpc3QoYWdncmVnYXRlZF9yZXN1bHRzXzVbbiwgNF0pKSwgIiwgIikKICAKICAjIEV4dHJhY3QgRXhwZWN0ZWQgdmFsdWVzIGZyb20gdGhlIGFnZ3JlZ2F0ZWRfcmVzdWx0c180IGRhdGFmcmFtZQogIEFza3Nfc2V0NSA8LSBzdHJzcGxpdChnc3ViKCJcXFt8XFxdIiwgIiIsIHVubGlzdChhZ2dyZWdhdGVkX3Jlc3VsdHNfNVtuLCA1XSkpLCAiLCAiKQogIAogICMgTG9vcCB0aHJvdWdoIGVhY2ggcG9zaXRpb24gKGkpCiAgZm9yIChpIGluIDE6MTAwKSB7CiAgICAjIEV4dHJhY3QgVHJ1ZSBhbmQgRXhwZWN0ZWQgdmFsdWVzIGZvciB0aGUgaS10aCBwb3NpdGlvbgogICAgQmlkcyA8LSBzYXBwbHkoQmlkc19zZXQ1LCBmdW5jdGlvbih4KSBhcy5udW1lcmljKHhbaV0pKQogICAgQXNrcyA8LSBzYXBwbHkoQXNrc19zZXQ1LCBmdW5jdGlvbih4KSBhcy5udW1lcmljKHhbaV0pKQogICAgCiAgICAjIENhbGN1bGF0ZSB0aGUgYXZlcmFnZSBvZiBUcnVlIGFuZCBFeHBlY3RlZCB2YWx1ZXMgZm9yIHRoZSBpLXRoIHBvc2l0aW9uCiAgICBhdmVyYWdlX2JpZFtpLCBuXSA8LSBtZWFuKEJpZHMsIG5hLnJtID0gVFJVRSkKICAgIGF2ZXJhZ2VfYXNrW2ksIG5dIDwtIG1lYW4oQXNrcywgbmEucm0gPSBUUlVFKQogIH0KfQoKIyBDYWxjdWxhdGUgdGhlIG92ZXJhbGwgYXZlcmFnZSBmb3IgZWFjaCBwb3NpdGlvbiBhY3Jvc3MgYWxsIHNpbXVsYXRpb25zCm92ZXJhbGxfYXZlcmFnZV9iaWQgPC0gcm93TWVhbnMoYXZlcmFnZV9iaWQsIG5hLnJtID0gVFJVRSkKb3ZlcmFsbF9hdmVyYWdlX2FzayA8LSByb3dNZWFucyhhdmVyYWdlX2FzaywgbmEucm0gPSBUUlVFKQoKIyMgVHJ1ZSBWYWx1ZQojIEluaXRpYWxpemUgbWF0cmljZXMgdG8gc3RvcmUgYXZlcmFnZXMgZm9yIGVhY2ggcG9zaXRpb24KYXZlcmFnZV90cnVlIDwtIG1hdHJpeChOQSwgbnJvdyA9IDEwMCwgbmNvbCA9IDEwKQphdmVyYWdlX2V4cGVjdGVkIDwtIG1hdHJpeChOQSwgbnJvdyA9IDEwMCwgbmNvbCA9IDEwKQoKIyBMb29wIHRocm91Z2ggZWFjaCBzaW11bGF0aW9uIChuKQpmb3IgKG4gaW4gMToxMCkgewogICMgRXh0cmFjdCBUcnVlIHZhbHVlcyBmcm9tIHRoZSBhZ2dyZWdhdGVkX3Jlc3VsdHNfNCBkYXRhZnJhbWUKICBUcnVlVmFsdWVzX3NldDUgPC0gc3Ryc3BsaXQoZ3N1YigiXFxbfFxcXSIsICIiLCB1bmxpc3QoYWdncmVnYXRlZF9yZXN1bHRzXzVbbiwgMl0pKSwgIiwgIikKCiAgIyBFeHRyYWN0IEV4cGVjdGVkIHZhbHVlcyBmcm9tIHRoZSBhZ2dyZWdhdGVkX3Jlc3VsdHNfNCBkYXRhZnJhbWUKICBFeHBlY3RlZFZhbHVlc19zZXQ1IDwtIHN0cnNwbGl0KGdzdWIoIlxcW3xcXF0iLCAiIiwgdW5saXN0KGFnZ3JlZ2F0ZWRfcmVzdWx0c181W24sIDNdKSksICIsICIpCiAgCiAgIyBMb29wIHRocm91Z2ggZWFjaCBwb3NpdGlvbiAoaSkKICBmb3IgKGkgaW4gMToxMDApIHsKICAgICMgRXh0cmFjdCBUcnVlIGFuZCBFeHBlY3RlZCB2YWx1ZXMgZm9yIHRoZSBpLXRoIHBvc2l0aW9uCiAgICBUcnVlX3ZhbHVlcyA8LSBzYXBwbHkoVHJ1ZVZhbHVlc19zZXQ1LCBmdW5jdGlvbih4KSBhcy5udW1lcmljKHhbaV0pKQogICAgRXhwZWN0ZWRfdmFsdWVzIDwtIHNhcHBseShFeHBlY3RlZFZhbHVlc19zZXQ1LCBmdW5jdGlvbih4KSBhcy5udW1lcmljKHhbaV0pKQogICAgCiAgICAjIENhbGN1bGF0ZSB0aGUgYXZlcmFnZSBvZiBUcnVlIGFuZCBFeHBlY3RlZCB2YWx1ZXMgZm9yIHRoZSBpLXRoIHBvc2l0aW9uCiAgICBhdmVyYWdlX3RydWVbaSwgbl0gPC0gbWVhbihUcnVlX3ZhbHVlcywgbmEucm0gPSBUUlVFKQogICAgYXZlcmFnZV9leHBlY3RlZFtpLCBuXSA8LSBtZWFuKEV4cGVjdGVkX3ZhbHVlcywgbmEucm0gPSBUUlVFKQogIH0KfQoKIyBDYWxjdWxhdGUgdGhlIG92ZXJhbGwgYXZlcmFnZSBmb3IgZWFjaCBwb3NpdGlvbiBhY3Jvc3MgYWxsIHNpbXVsYXRpb25zCm92ZXJhbGxfYXZlcmFnZV90cnVlIDwtIHJvd01lYW5zKGF2ZXJhZ2VfdHJ1ZSwgbmEucm0gPSBUUlVFKQpvdmVyYWxsX2F2ZXJhZ2VfZXhwZWN0ZWQgPC0gcm93TWVhbnMoYXZlcmFnZV9leHBlY3RlZCwgbmEucm0gPSBUUlVFKQoKIyBQbG90IHRoZSBvdmVyYWxsIGF2ZXJhZ2VzCiNwbG90KG92ZXJhbGxfYXZlcmFnZV90cnVlLCB0eXBlID0gImwiLCBwY2ggPSAxNiwgY29sID0gImJsdWUiLCBtYWluID0gIk92ZXJhbGwgQXZlcmFnZSBvZiBUcnVlIHZzIEV4cGVjdGVkIFZhbHVlcyIsIHhsYWIgPSAiUG9zaXRpb24gaW4gTGlzdCIsIHlsYWIgPSAiVmFsdWUiLCB5bGltID0gYyhtaW4oYyhvdmVyYWxsX2F2ZXJhZ2VfdHJ1ZSwgb3ZlcmFsbF9hdmVyYWdlX2V4cGVjdGVkKSksIG1heChjKG92ZXJhbGxfYXZlcmFnZV90cnVlLCBvdmVyYWxsX2F2ZXJhZ2VfZXhwZWN0ZWQpKSkpCiNsaW5lcyhvdmVyYWxsX2F2ZXJhZ2VfZXhwZWN0ZWQsIHR5cGUgPSAibCIsIHBjaCA9IDE2LCBjb2wgPSAicmVkIikKI2xlZ2VuZCgidG9wcmlnaHQiLCBsZWdlbmQgPSBjKCJUcnVlIFZhbHVlcyIsICJFeHBlY3RlZCBWYWx1ZXMiKSwgY29sID0gYygiYmx1ZSIsICJyZWQiKSwgbHR5ID0gMSwgY2V4ID0gMC44KQoKIyBQbG90IHRoZSBvdmVyYWxsIGF2ZXJhZ2VzCnBsb3Qob3ZlcmFsbF9hdmVyYWdlX2JpZCwgdHlwZSA9ICJsIiwgcGNoID0gMTYsIGNvbCA9ICJibHVlIiwgbWFpbiA9ICJPdmVyYWxsIEF2ZXJhZ2Ugb2YgQmlkcyB2cyBBc2tzICYgVHJ1ZSB2cyBFeHBlY3RlZCBWYWx1ZXMiLCB4bGFiID0gIlBvc2l0aW9uIGluIExpc3QiLCB5bGFiID0gIlZhbHVlIiwgeWxpbSA9IGMobWluKGMob3ZlcmFsbF9hdmVyYWdlX2JpZCwgb3ZlcmFsbF9hdmVyYWdlX2Fzaywgb3ZlcmFsbF9hdmVyYWdlX3RydWUsIG92ZXJhbGxfYXZlcmFnZV9leHBlY3RlZCkpLCBtYXgoYyhvdmVyYWxsX2F2ZXJhZ2VfYmlkLCBvdmVyYWxsX2F2ZXJhZ2VfYXNrLCBvdmVyYWxsX2F2ZXJhZ2VfdHJ1ZSwgb3ZlcmFsbF9hdmVyYWdlX2V4cGVjdGVkKSkpKQpsaW5lcyhvdmVyYWxsX2F2ZXJhZ2VfYXNrLCB0eXBlID0gImwiLCBwY2ggPSAxNiwgY29sID0gInJlZCIpCmxpbmVzKG92ZXJhbGxfYXZlcmFnZV90cnVlLCB0eXBlID0gImwiLCBwY2ggPSAxNiwgY29sID0gImdyZWVuIikKbGluZXMob3ZlcmFsbF9hdmVyYWdlX2V4cGVjdGVkLCB0eXBlID0gImwiLCBwY2ggPSAxNiwgY29sID0gInB1cnBsZSIpCmxlZ2VuZCgiYm90dG9tbGVmdCIsIGxlZ2VuZCA9IGMoIkJpZHMiLCAiQXNrcyIsICJUcnVlIFZhbHVlIiwgIkV4cGVjdGVkIFZhbHVlIiksIGNvbCA9IGMoImJsdWUiLCAicmVkIiwgImdyZWVuIiwgInB1cnBsZSIpLCBsdHkgPSAxLCBjZXggPSAwLjgpCmBgYAoKCmBgYHtyfQojIEluaXRpYWxpemUgbWF0cmljZXMgdG8gc3RvcmUgYXZlcmFnZXMgZm9yIGVhY2ggcG9zaXRpb24KYXZlcmFnZV9NTV9wbmwgPC0gbWF0cml4KE5BLCBucm93ID0gMTAwLCBuY29sID0gMTApCmF2ZXJhZ2VfTm9pc3kxX3BubCA8LSBtYXRyaXgoTkEsIG5yb3cgPSAxMDAsIG5jb2wgPSAxMCkKYXZlcmFnZV9Ob2lzeTJfcG5sIDwtIG1hdHJpeChOQSwgbnJvdyA9IDEwMCwgbmNvbCA9IDEwKQphdmVyYWdlX05vaXN5M19wbmwgPC0gbWF0cml4KE5BLCBucm93ID0gMTAwLCBuY29sID0gMTApCmF2ZXJhZ2VfTm9pc3k0X3BubCA8LSBtYXRyaXgoTkEsIG5yb3cgPSAxMDAsIG5jb2wgPSAxMCkKYXZlcmFnZV9Ob2lzeTVfcG5sIDwtIG1hdHJpeChOQSwgbnJvdyA9IDEwMCwgbmNvbCA9IDEwKQphdmVyYWdlX05vaXN5Nl9wbmwgPC0gbWF0cml4KE5BLCBucm93ID0gMTAwLCBuY29sID0gMTApCgojIExvb3AgdGhyb3VnaCBlYWNoIHNpbXVsYXRpb24gKG4pCmZvciAobiBpbiAxOjEwKSB7CgogIE1NX3BubF9zZXQ1IDwtIHN0cnNwbGl0KGdzdWIoIlxcW3xcXF0iLCAiIiwgdW5saXN0KGFnZ3JlZ2F0ZWRfcmVzdWx0c181W24sIDZdKSksICIsICIpCgogIE5vaXN5MV9wbmxfc2V0NSA8LSBzdHJzcGxpdChnc3ViKCJcXFt8XFxdIiwgIiIsIHVubGlzdChhZ2dyZWdhdGVkX3Jlc3VsdHNfNVtuLCA4XSkpLCAiLCAiKQogIAogIE5vaXN5Ml9wbmxfc2V0NSA8LSBzdHJzcGxpdChnc3ViKCJcXFt8XFxdIiwgIiIsIHVubGlzdChhZ2dyZWdhdGVkX3Jlc3VsdHNfNVtuLCAxMF0pKSwgIiwgIikKICAKICBOb2lzeTNfcG5sX3NldDUgPC0gc3Ryc3BsaXQoZ3N1YigiXFxbfFxcXSIsICIiLCB1bmxpc3QoYWdncmVnYXRlZF9yZXN1bHRzXzVbbiwgMTJdKSksICIsICIpCiAgCiAgTm9pc3k0X3BubF9zZXQ1IDwtIHN0cnNwbGl0KGdzdWIoIlxcW3xcXF0iLCAiIiwgdW5saXN0KGFnZ3JlZ2F0ZWRfcmVzdWx0c181W24sIDE0XSkpLCAiLCAiKQogIAogIE5vaXN5NV9wbmxfc2V0NSA8LSBzdHJzcGxpdChnc3ViKCJcXFt8XFxdIiwgIiIsIHVubGlzdChhZ2dyZWdhdGVkX3Jlc3VsdHNfNVtuLCAxNl0pKSwgIiwgIikKICAKICBOb2lzeTZfcG5sX3NldDUgPC0gc3Ryc3BsaXQoZ3N1YigiXFxbfFxcXSIsICIiLCB1bmxpc3QoYWdncmVnYXRlZF9yZXN1bHRzXzVbbiwgMThdKSksICIsICIpCiAgCiAgIyBMb29wIHRocm91Z2ggZWFjaCBwb3NpdGlvbiAoaSkKICBmb3IgKGkgaW4gMToxMDApIHsKICAgICMgRXh0cmFjdCBUcnVlIGFuZCBFeHBlY3RlZCB2YWx1ZXMgZm9yIHRoZSBpLXRoIHBvc2l0aW9uCiAgICBNTV9wbmwgPC0gc2FwcGx5KE1NX3BubF9zZXQ1LCBmdW5jdGlvbih4KSBhcy5udW1lcmljKHhbaV0pKQogICAgTm9pc3kxX3BubCA8LSBzYXBwbHkoTm9pc3kxX3BubF9zZXQ1LCBmdW5jdGlvbih4KSBhcy5udW1lcmljKHhbaV0pKQogICAgTm9pc3kyX3BubCA8LSBzYXBwbHkoTm9pc3kyX3BubF9zZXQ1LCBmdW5jdGlvbih4KSBhcy5udW1lcmljKHhbaV0pKQogICAgTm9pc3kzX3BubCA8LSBzYXBwbHkoTm9pc3kzX3BubF9zZXQ1LCBmdW5jdGlvbih4KSBhcy5udW1lcmljKHhbaV0pKQogICAgTm9pc3k0X3BubCA8LSBzYXBwbHkoTm9pc3k0X3BubF9zZXQ1LCBmdW5jdGlvbih4KSBhcy5udW1lcmljKHhbaV0pKQogICAgTm9pc3k1X3BubCA8LSBzYXBwbHkoTm9pc3k1X3BubF9zZXQ1LCBmdW5jdGlvbih4KSBhcy5udW1lcmljKHhbaV0pKQogICAgTm9pc3k2X3BubCA8LSBzYXBwbHkoTm9pc3k2X3BubF9zZXQ1LCBmdW5jdGlvbih4KSBhcy5udW1lcmljKHhbaV0pKQogICAgCiAgICAjIENhbGN1bGF0ZSB0aGUgYXZlcmFnZSBvZiBUcnVlIGFuZCBFeHBlY3RlZCB2YWx1ZXMgZm9yIHRoZSBpLXRoIHBvc2l0aW9uCiAgICBhdmVyYWdlX01NX3BubFtpLCBuXSA8LSBtZWFuKE1NX3BubCwgbmEucm0gPSBUUlVFKQogICAgYXZlcmFnZV9Ob2lzeTFfcG5sW2ksIG5dIDwtIG1lYW4oTm9pc3kxX3BubCwgbmEucm0gPSBUUlVFKQogICAgYXZlcmFnZV9Ob2lzeTJfcG5sW2ksIG5dIDwtIG1lYW4oTm9pc3kyX3BubCwgbmEucm0gPSBUUlVFKQogICAgYXZlcmFnZV9Ob2lzeTNfcG5sW2ksIG5dIDwtIG1lYW4oTm9pc3kzX3BubCwgbmEucm0gPSBUUlVFKQogICAgYXZlcmFnZV9Ob2lzeTRfcG5sW2ksIG5dIDwtIG1lYW4oTm9pc3k0X3BubCwgbmEucm0gPSBUUlVFKQogICAgYXZlcmFnZV9Ob2lzeTVfcG5sW2ksIG5dIDwtIG1lYW4oTm9pc3k1X3BubCwgbmEucm0gPSBUUlVFKQogICAgYXZlcmFnZV9Ob2lzeTZfcG5sW2ksIG5dIDwtIG1lYW4oTm9pc3k2X3BubCwgbmEucm0gPSBUUlVFKQogIH0KfQoKIyBDYWxjdWxhdGUgdGhlIG92ZXJhbGwgYXZlcmFnZSBmb3IgZWFjaCBwb3NpdGlvbiBhY3Jvc3MgYWxsIHNpbXVsYXRpb25zCm92ZXJhbGxfYXZlcmFnZV9NTV9wbmwgPC0gcm93TWVhbnMoYXZlcmFnZV9NTV9wbmwsIG5hLnJtID0gVFJVRSkKb3ZlcmFsbF9hdmVyYWdlX05vaXN5MV9wbmwgPC0gcm93TWVhbnMoYXZlcmFnZV9Ob2lzeTFfcG5sLCBuYS5ybSA9IFRSVUUpCm92ZXJhbGxfYXZlcmFnZV9Ob2lzeTJfcG5sIDwtIHJvd01lYW5zKGF2ZXJhZ2VfTm9pc3kyX3BubCwgbmEucm0gPSBUUlVFKQpvdmVyYWxsX2F2ZXJhZ2VfTm9pc3kzX3BubCA8LSByb3dNZWFucyhhdmVyYWdlX05vaXN5M19wbmwsIG5hLnJtID0gVFJVRSkKb3ZlcmFsbF9hdmVyYWdlX05vaXN5NF9wbmwgPC0gcm93TWVhbnMoYXZlcmFnZV9Ob2lzeTRfcG5sLCBuYS5ybSA9IFRSVUUpCm92ZXJhbGxfYXZlcmFnZV9Ob2lzeTVfcG5sIDwtIHJvd01lYW5zKGF2ZXJhZ2VfTm9pc3k1X3BubCwgbmEucm0gPSBUUlVFKQpvdmVyYWxsX2F2ZXJhZ2VfTm9pc3k2X3BubCA8LSByb3dNZWFucyhhdmVyYWdlX05vaXN5Nl9wbmwsIG5hLnJtID0gVFJVRSkKCiMgUGxvdCB0aGUgb3ZlcmFsbCBhdmVyYWdlcwpwbG90KG92ZXJhbGxfYXZlcmFnZV9NTV9wbmwsIHR5cGUgPSAibCIsIHBjaCA9IDE2LCBjb2wgPSAiYmxhY2siLCBtYWluID0gIk92ZXJhbGwgQXZlcmFnZSBQTkwiLCB4bGFiID0gIlBvc2l0aW9uIGluIExpc3QiLCB5bGFiID0gIlZhbHVlIiwgeWxpbSA9IGMobWluKGMob3ZlcmFsbF9hdmVyYWdlX01NX3BubCwgb3ZlcmFsbF9hdmVyYWdlX05vaXN5MV9wbmwsIG92ZXJhbGxfYXZlcmFnZV9Ob2lzeTJfcG5sLCBvdmVyYWxsX2F2ZXJhZ2VfTm9pc3kzX3BubCwgb3ZlcmFsbF9hdmVyYWdlX05vaXN5NF9wbmwsIG92ZXJhbGxfYXZlcmFnZV9Ob2lzeTVfcG5sLCBvdmVyYWxsX2F2ZXJhZ2VfTm9pc3k2X3BubCkpLCBtYXgoYyhvdmVyYWxsX2F2ZXJhZ2VfTU1fcG5sLCBvdmVyYWxsX2F2ZXJhZ2VfTm9pc3kxX3BubCwgb3ZlcmFsbF9hdmVyYWdlX05vaXN5Ml9wbmwsIG92ZXJhbGxfYXZlcmFnZV9Ob2lzeTNfcG5sLCBvdmVyYWxsX2F2ZXJhZ2VfTm9pc3k0X3BubCwgb3ZlcmFsbF9hdmVyYWdlX05vaXN5NV9wbmwsIG92ZXJhbGxfYXZlcmFnZV9Ob2lzeTZfcG5sKSkpKQpsaW5lcyhvdmVyYWxsX2F2ZXJhZ2VfTm9pc3kxX3BubCwgdHlwZSA9ICJsIiwgcGNoID0gMTYsIGNvbCA9ICJyZWQiKQpsaW5lcyhvdmVyYWxsX2F2ZXJhZ2VfTm9pc3kyX3BubCwgdHlwZSA9ICJsIiwgcGNoID0gMTYsIGNvbCA9ICJncmVlbiIpCmxpbmVzKG92ZXJhbGxfYXZlcmFnZV9Ob2lzeTNfcG5sLCB0eXBlID0gImwiLCBwY2ggPSAxNiwgY29sID0gInllbGxvdyIpCmxpbmVzKG92ZXJhbGxfYXZlcmFnZV9Ob2lzeTRfcG5sLCB0eXBlID0gImwiLCBwY2ggPSAxNiwgY29sID0gImJsdWUiKQpsaW5lcyhvdmVyYWxsX2F2ZXJhZ2VfTm9pc3k1X3BubCwgdHlwZSA9ICJsIiwgcGNoID0gMTYsIGNvbCA9ICJwdXJwbGUiKQpsaW5lcyhvdmVyYWxsX2F2ZXJhZ2VfTm9pc3k2X3BubCwgdHlwZSA9ICJsIiwgcGNoID0gMTYsIGNvbCA9ICJvcmFuZ2UiKQoKIyBBZGQgbGVnZW5kCmxlZ2VuZCgidG9wbGVmdCIsIGxlZ2VuZCA9IGMoIk1hcmtldCBNYWtlciIsICJOb2lzeSAxIiwgIk5vaXN5IDIiLCAiTm9pc3kgMyIsICJOb2lzeSA0IiwgIk5vaXN5IDUiLCAiTm9pc3kgNiIpLCBjb2wgPSBjKCJibGFjayIsICJyZWQiLCAiZ3JlZW4iLCAieWVsbG93IiwgImJsdWUiLCAicHVycGxlIiwgIm9yYW5nZSIpLCBsdHkgPSAxLCBjZXggPSAwLjgpCmBgYAoKCmBgYHtyfQojIEluaXRpYWxpemUgbWF0cmljZXMgdG8gc3RvcmUgYXZlcmFnZXMgZm9yIGVhY2ggcG9zaXRpb24KYXZlcmFnZV9NTV9wb3MgPC0gbWF0cml4KE5BLCBucm93ID0gMTAwLCBuY29sID0gMTApCmF2ZXJhZ2VfTm9pc3kxX3BvcyA8LSBtYXRyaXgoTkEsIG5yb3cgPSAxMDAsIG5jb2wgPSAxMCkKYXZlcmFnZV9Ob2lzeTJfcG9zIDwtIG1hdHJpeChOQSwgbnJvdyA9IDEwMCwgbmNvbCA9IDEwKQphdmVyYWdlX05vaXN5M19wb3MgPC0gbWF0cml4KE5BLCBucm93ID0gMTAwLCBuY29sID0gMTApCmF2ZXJhZ2VfTm9pc3k0X3BvcyA8LSBtYXRyaXgoTkEsIG5yb3cgPSAxMDAsIG5jb2wgPSAxMCkKYXZlcmFnZV9Ob2lzeTVfcG9zIDwtIG1hdHJpeChOQSwgbnJvdyA9IDEwMCwgbmNvbCA9IDEwKQphdmVyYWdlX05vaXN5Nl9wb3MgPC0gbWF0cml4KE5BLCBucm93ID0gMTAwLCBuY29sID0gMTApCgojIExvb3AgdGhyb3VnaCBlYWNoIHNpbXVsYXRpb24gKG4pCmZvciAobiBpbiAxOjEwKSB7CgogIE1NX3Bvc19zZXQ1IDwtIHN0cnNwbGl0KGdzdWIoIlxcW3xcXF0iLCAiIiwgdW5saXN0KGFnZ3JlZ2F0ZWRfcmVzdWx0c181W24sIDddKSksICIsICIpCgogIE5vaXN5MV9wb3Nfc2V0NSA8LSBzdHJzcGxpdChnc3ViKCJcXFt8XFxdIiwgIiIsIHVubGlzdChhZ2dyZWdhdGVkX3Jlc3VsdHNfNVtuLCA5XSkpLCAiLCAiKQogIAogIE5vaXN5Ml9wb3Nfc2V0NSA8LSBzdHJzcGxpdChnc3ViKCJcXFt8XFxdIiwgIiIsIHVubGlzdChhZ2dyZWdhdGVkX3Jlc3VsdHNfNVtuLCAxMV0pKSwgIiwgIikKICAKICBOb2lzeTNfcG9zX3NldDUgPC0gc3Ryc3BsaXQoZ3N1YigiXFxbfFxcXSIsICIiLCB1bmxpc3QoYWdncmVnYXRlZF9yZXN1bHRzXzVbbiwgMTNdKSksICIsICIpCiAgCiAgTm9pc3k0X3Bvc19zZXQ1IDwtIHN0cnNwbGl0KGdzdWIoIlxcW3xcXF0iLCAiIiwgdW5saXN0KGFnZ3JlZ2F0ZWRfcmVzdWx0c181W24sIDE1XSkpLCAiLCAiKQogIAogIE5vaXN5NV9wb3Nfc2V0NSA8LSBzdHJzcGxpdChnc3ViKCJcXFt8XFxdIiwgIiIsIHVubGlzdChhZ2dyZWdhdGVkX3Jlc3VsdHNfNVtuLCAxN10pKSwgIiwgIikKICAKICBOb2lzeTZfcG9zX3NldDUgPC0gc3Ryc3BsaXQoZ3N1YigiXFxbfFxcXSIsICIiLCB1bmxpc3QoYWdncmVnYXRlZF9yZXN1bHRzXzVbbiwgMTldKSksICIsICIpCiAgCiAgIyBMb29wIHRocm91Z2ggZWFjaCBwb3NpdGlvbiAoaSkKICBmb3IgKGkgaW4gMToxMDApIHsKICAgICMgRXh0cmFjdCBUcnVlIGFuZCBFeHBlY3RlZCB2YWx1ZXMgZm9yIHRoZSBpLXRoIHBvc2l0aW9uCiAgICBNTV9wb3MgPC0gc2FwcGx5KE1NX3Bvc19zZXQ1LCBmdW5jdGlvbih4KSBhcy5udW1lcmljKHhbaV0pKQogICAgTm9pc3kxX3BvcyA8LSBzYXBwbHkoTm9pc3kxX3Bvc19zZXQ1LCBmdW5jdGlvbih4KSBhcy5udW1lcmljKHhbaV0pKQogICAgTm9pc3kyX3BvcyA8LSBzYXBwbHkoTm9pc3kyX3Bvc19zZXQ1LCBmdW5jdGlvbih4KSBhcy5udW1lcmljKHhbaV0pKQogICAgTm9pc3kzX3BvcyA8LSBzYXBwbHkoTm9pc3kzX3Bvc19zZXQ1LCBmdW5jdGlvbih4KSBhcy5udW1lcmljKHhbaV0pKQogICAgTm9pc3k0X3BvcyA8LSBzYXBwbHkoTm9pc3k0X3Bvc19zZXQ1LCBmdW5jdGlvbih4KSBhcy5udW1lcmljKHhbaV0pKQogICAgTm9pc3k1X3BvcyA8LSBzYXBwbHkoTm9pc3k1X3Bvc19zZXQ1LCBmdW5jdGlvbih4KSBhcy5udW1lcmljKHhbaV0pKQogICAgTm9pc3k2X3BvcyA8LSBzYXBwbHkoTm9pc3k2X3Bvc19zZXQ1LCBmdW5jdGlvbih4KSBhcy5udW1lcmljKHhbaV0pKQogICAgCiAgICAjIENhbGN1bGF0ZSB0aGUgYXZlcmFnZSBvZiBUcnVlIGFuZCBFeHBlY3RlZCB2YWx1ZXMgZm9yIHRoZSBpLXRoIHBvc2l0aW9uCiAgICBhdmVyYWdlX01NX3Bvc1tpLCBuXSA8LSBtZWFuKE1NX3BvcywgbmEucm0gPSBUUlVFKQogICAgYXZlcmFnZV9Ob2lzeTFfcG9zW2ksIG5dIDwtIG1lYW4oTm9pc3kxX3BvcywgbmEucm0gPSBUUlVFKQogICAgYXZlcmFnZV9Ob2lzeTJfcG9zW2ksIG5dIDwtIG1lYW4oTm9pc3kyX3BvcywgbmEucm0gPSBUUlVFKQogICAgYXZlcmFnZV9Ob2lzeTNfcG9zW2ksIG5dIDwtIG1lYW4oTm9pc3kzX3BvcywgbmEucm0gPSBUUlVFKQogICAgYXZlcmFnZV9Ob2lzeTRfcG9zW2ksIG5dIDwtIG1lYW4oTm9pc3k0X3BvcywgbmEucm0gPSBUUlVFKQogICAgYXZlcmFnZV9Ob2lzeTVfcG9zW2ksIG5dIDwtIG1lYW4oTm9pc3k1X3BvcywgbmEucm0gPSBUUlVFKQogICAgYXZlcmFnZV9Ob2lzeTZfcG9zW2ksIG5dIDwtIG1lYW4oTm9pc3k2X3BvcywgbmEucm0gPSBUUlVFKQogIH0KfQoKIyBDYWxjdWxhdGUgdGhlIG92ZXJhbGwgYXZlcmFnZSBmb3IgZWFjaCBwb3NpdGlvbiBhY3Jvc3MgYWxsIHNpbXVsYXRpb25zCm92ZXJhbGxfYXZlcmFnZV9NTV9wb3MgPC0gcm93TWVhbnMoYXZlcmFnZV9NTV9wb3MsIG5hLnJtID0gVFJVRSkKb3ZlcmFsbF9hdmVyYWdlX05vaXN5MV9wb3MgPC0gcm93TWVhbnMoYXZlcmFnZV9Ob2lzeTFfcG9zLCBuYS5ybSA9IFRSVUUpCm92ZXJhbGxfYXZlcmFnZV9Ob2lzeTJfcG9zIDwtIHJvd01lYW5zKGF2ZXJhZ2VfTm9pc3kyX3BvcywgbmEucm0gPSBUUlVFKQpvdmVyYWxsX2F2ZXJhZ2VfTm9pc3kzX3BvcyA8LSByb3dNZWFucyhhdmVyYWdlX05vaXN5M19wb3MsIG5hLnJtID0gVFJVRSkKb3ZlcmFsbF9hdmVyYWdlX05vaXN5NF9wb3MgPC0gcm93TWVhbnMoYXZlcmFnZV9Ob2lzeTRfcG9zLCBuYS5ybSA9IFRSVUUpCm92ZXJhbGxfYXZlcmFnZV9Ob2lzeTVfcG9zIDwtIHJvd01lYW5zKGF2ZXJhZ2VfTm9pc3k1X3BvcywgbmEucm0gPSBUUlVFKQpvdmVyYWxsX2F2ZXJhZ2VfTm9pc3k2X3BvcyA8LSByb3dNZWFucyhhdmVyYWdlX05vaXN5Nl9wb3MsIG5hLnJtID0gVFJVRSkKCiMgUGxvdCB0aGUgb3ZlcmFsbCBhdmVyYWdlcwpwbG90KG92ZXJhbGxfYXZlcmFnZV9NTV9wb3MsIHR5cGUgPSAibCIsIHBjaCA9IDE2LCBjb2wgPSAiYmxhY2siLCBtYWluID0gIk92ZXJhbGwgQXZlcmFnZSBQb3NpdGlvbiIsIHhsYWIgPSAiUG9zaXRpb24gaW4gTGlzdCIsIHlsYWIgPSAiVmFsdWUiLCB5bGltID0gYyhtaW4oYyhvdmVyYWxsX2F2ZXJhZ2VfTU1fcG9zLCBvdmVyYWxsX2F2ZXJhZ2VfTm9pc3kxX3Bvcywgb3ZlcmFsbF9hdmVyYWdlX05vaXN5Ml9wb3MsIG92ZXJhbGxfYXZlcmFnZV9Ob2lzeTNfcG9zLCBvdmVyYWxsX2F2ZXJhZ2VfTm9pc3k0X3Bvcywgb3ZlcmFsbF9hdmVyYWdlX05vaXN5NV9wb3MsIG92ZXJhbGxfYXZlcmFnZV9Ob2lzeTZfcG9zKSksIG1heChjKG92ZXJhbGxfYXZlcmFnZV9NTV9wb3MsIG92ZXJhbGxfYXZlcmFnZV9Ob2lzeTFfcG9zLCBvdmVyYWxsX2F2ZXJhZ2VfTm9pc3kyX3Bvcywgb3ZlcmFsbF9hdmVyYWdlX05vaXN5M19wb3MsIG92ZXJhbGxfYXZlcmFnZV9Ob2lzeTRfcG9zLCBvdmVyYWxsX2F2ZXJhZ2VfTm9pc3k1X3Bvcywgb3ZlcmFsbF9hdmVyYWdlX05vaXN5Nl9wb3MpKSkpCmxpbmVzKG92ZXJhbGxfYXZlcmFnZV9Ob2lzeTFfcG9zLCB0eXBlID0gImwiLCBwY2ggPSAxNiwgY29sID0gInJlZCIpCmxpbmVzKG92ZXJhbGxfYXZlcmFnZV9Ob2lzeTJfcG9zLCB0eXBlID0gImwiLCBwY2ggPSAxNiwgY29sID0gImdyZWVuIikKbGluZXMob3ZlcmFsbF9hdmVyYWdlX05vaXN5M19wb3MsIHR5cGUgPSAibCIsIHBjaCA9IDE2LCBjb2wgPSAieWVsbG93IikKbGluZXMob3ZlcmFsbF9hdmVyYWdlX05vaXN5NF9wb3MsIHR5cGUgPSAibCIsIHBjaCA9IDE2LCBjb2wgPSAiYmx1ZSIpCmxpbmVzKG92ZXJhbGxfYXZlcmFnZV9Ob2lzeTVfcG9zLCB0eXBlID0gImwiLCBwY2ggPSAxNiwgY29sID0gInB1cnBsZSIpCmxpbmVzKG92ZXJhbGxfYXZlcmFnZV9Ob2lzeTZfcG9zLCB0eXBlID0gImwiLCBwY2ggPSAxNiwgY29sID0gIm9yYW5nZSIpCgojIEFkZCBsZWdlbmQKbGVnZW5kKCJ0b3BsZWZ0IiwgbGVnZW5kID0gYygiTWFya2V0IE1ha2VyIiwgIk5vaXN5IDEiLCAiTm9pc3kgMiIsICJOb2lzeSAzIiwgIk5vaXN5IDQiLCAiTm9pc3kgNSIsICJOb2lzeSA2IiksIGNvbCA9IGMoImJsYWNrIiwgInJlZCIsICJncmVlbiIsICJ5ZWxsb3ciLCAiYmx1ZSIsICJwdXJwbGUiLCAib3JhbmdlIiksIGx0eSA9IDEsIGNleCA9IDAuOCkKYGBgCgoKIyMgc2V0NiAoMSBpbmZvcm1lZCArIDUgbm9pc3kpCgpgYGB7cn0KIyBJbml0aWFsaXplIG1hdHJpY2VzIHRvIHN0b3JlIGF2ZXJhZ2VzIGZvciBlYWNoIHBvc2l0aW9uCmF2ZXJhZ2VfdHJ1ZSA8LSBtYXRyaXgoTkEsIG5yb3cgPSAxMDAsIG5jb2wgPSAxMCkKYXZlcmFnZV9leHBlY3RlZCA8LSBtYXRyaXgoTkEsIG5yb3cgPSAxMDAsIG5jb2wgPSAxMCkKCiMgTG9vcCB0aHJvdWdoIGVhY2ggc2ltdWxhdGlvbiAobikKZm9yIChuIGluIDE6MTApIHsKICAjIEV4dHJhY3QgVHJ1ZSB2YWx1ZXMgZnJvbSB0aGUgYWdncmVnYXRlZF9yZXN1bHRzXzQgZGF0YWZyYW1lCiAgVHJ1ZVZhbHVlc19zZXQ2IDwtIHN0cnNwbGl0KGdzdWIoIlxcW3xcXF0iLCAiIiwgdW5saXN0KGFnZ3JlZ2F0ZWRfcmVzdWx0c182W24sIDJdKSksICIsICIpCiAgCiAgIyBFeHRyYWN0IEV4cGVjdGVkIHZhbHVlcyBmcm9tIHRoZSBhZ2dyZWdhdGVkX3Jlc3VsdHNfNCBkYXRhZnJhbWUKICBFeHBlY3RlZFZhbHVlc19zZXQ2IDwtIHN0cnNwbGl0KGdzdWIoIlxcW3xcXF0iLCAiIiwgdW5saXN0KGFnZ3JlZ2F0ZWRfcmVzdWx0c182W24sIDNdKSksICIsICIpCiAgCiAgIyBMb29wIHRocm91Z2ggZWFjaCBwb3NpdGlvbiAoaSkKICBmb3IgKGkgaW4gMToxMDApIHsKICAgICMgRXh0cmFjdCBUcnVlIGFuZCBFeHBlY3RlZCB2YWx1ZXMgZm9yIHRoZSBpLXRoIHBvc2l0aW9uCiAgICBUcnVlX3ZhbHVlcyA8LSBzYXBwbHkoVHJ1ZVZhbHVlc19zZXQ2LCBmdW5jdGlvbih4KSBhcy5udW1lcmljKHhbaV0pKQogICAgRXhwZWN0ZWRfdmFsdWVzIDwtIHNhcHBseShFeHBlY3RlZFZhbHVlc19zZXQ2LCBmdW5jdGlvbih4KSBhcy5udW1lcmljKHhbaV0pKQogICAgCiAgICAjIENhbGN1bGF0ZSB0aGUgYXZlcmFnZSBvZiBUcnVlIGFuZCBFeHBlY3RlZCB2YWx1ZXMgZm9yIHRoZSBpLXRoIHBvc2l0aW9uCiAgICBhdmVyYWdlX3RydWVbaSwgbl0gPC0gbWVhbihUcnVlX3ZhbHVlcywgbmEucm0gPSBUUlVFKQogICAgYXZlcmFnZV9leHBlY3RlZFtpLCBuXSA8LSBtZWFuKEV4cGVjdGVkX3ZhbHVlcywgbmEucm0gPSBUUlVFKQogIH0KfQoKIyBDYWxjdWxhdGUgdGhlIG92ZXJhbGwgYXZlcmFnZSBmb3IgZWFjaCBwb3NpdGlvbiBhY3Jvc3MgYWxsIHNpbXVsYXRpb25zCm92ZXJhbGxfYXZlcmFnZV90cnVlIDwtIHJvd01lYW5zKGF2ZXJhZ2VfdHJ1ZSwgbmEucm0gPSBUUlVFKQpvdmVyYWxsX2F2ZXJhZ2VfZXhwZWN0ZWQgPC0gcm93TWVhbnMoYXZlcmFnZV9leHBlY3RlZCwgbmEucm0gPSBUUlVFKQoKIyBQbG90IHRoZSBvdmVyYWxsIGF2ZXJhZ2VzCnBsb3Qob3ZlcmFsbF9hdmVyYWdlX3RydWUsIHR5cGUgPSAibCIsIHBjaCA9IDE2LCBjb2wgPSAiYmx1ZSIsIG1haW4gPSAiT3ZlcmFsbCBBdmVyYWdlIG9mIFRydWUgdnMgRXhwZWN0ZWQgVmFsdWVzIiwgeGxhYiA9ICJQb3NpdGlvbiBpbiBMaXN0IiwgeWxhYiA9ICJWYWx1ZSIsIHlsaW0gPSBjKG1pbihjKG92ZXJhbGxfYXZlcmFnZV90cnVlLCBvdmVyYWxsX2F2ZXJhZ2VfZXhwZWN0ZWQpKSwgbWF4KGMob3ZlcmFsbF9hdmVyYWdlX3RydWUsIG92ZXJhbGxfYXZlcmFnZV9leHBlY3RlZCkpKSkKbGluZXMob3ZlcmFsbF9hdmVyYWdlX2V4cGVjdGVkLCB0eXBlID0gImwiLCBwY2ggPSAxNiwgY29sID0gInJlZCIpCmxlZ2VuZCgidG9wcmlnaHQiLCBsZWdlbmQgPSBjKCJUcnVlIFZhbHVlcyIsICJFeHBlY3RlZCBWYWx1ZXMiKSwgY29sID0gYygiYmx1ZSIsICJyZWQiKSwgbHR5ID0gMSwgY2V4ID0gMC44KQpgYGAKCgoKYGBge3J9CiMgSW5pdGlhbGl6ZSBtYXRyaWNlcyB0byBzdG9yZSBhdmVyYWdlcyBmb3IgZWFjaCBwb3NpdGlvbgphdmVyYWdlX2JpZCA8LSBtYXRyaXgoTkEsIG5yb3cgPSAxMDAsIG5jb2wgPSAxMCkKYXZlcmFnZV9hc2sgPC0gbWF0cml4KE5BLCBucm93ID0gMTAwLCBuY29sID0gMTApCgojIExvb3AgdGhyb3VnaCBlYWNoIHNpbXVsYXRpb24gKG4pCmZvciAobiBpbiAxOjEwKSB7CiAgIyBFeHRyYWN0IFRydWUgdmFsdWVzIGZyb20gdGhlIGFnZ3JlZ2F0ZWRfcmVzdWx0c180IGRhdGFmcmFtZQogIEJpZHNfc2V0NiA8LSBzdHJzcGxpdChnc3ViKCJcXFt8XFxdIiwgIiIsIHVubGlzdChhZ2dyZWdhdGVkX3Jlc3VsdHNfNltuLCA0XSkpLCAiLCAiKQogIAogICMgRXh0cmFjdCBFeHBlY3RlZCB2YWx1ZXMgZnJvbSB0aGUgYWdncmVnYXRlZF9yZXN1bHRzXzQgZGF0YWZyYW1lCiAgQXNrc19zZXQ2IDwtIHN0cnNwbGl0KGdzdWIoIlxcW3xcXF0iLCAiIiwgdW5saXN0KGFnZ3JlZ2F0ZWRfcmVzdWx0c182W24sIDVdKSksICIsICIpCiAgCiAgIyBMb29wIHRocm91Z2ggZWFjaCBwb3NpdGlvbiAoaSkKICBmb3IgKGkgaW4gMToxMDApIHsKICAgICMgRXh0cmFjdCBUcnVlIGFuZCBFeHBlY3RlZCB2YWx1ZXMgZm9yIHRoZSBpLXRoIHBvc2l0aW9uCiAgICBCaWRzIDwtIHNhcHBseShCaWRzX3NldDYsIGZ1bmN0aW9uKHgpIGFzLm51bWVyaWMoeFtpXSkpCiAgICBBc2tzIDwtIHNhcHBseShBc2tzX3NldDYsIGZ1bmN0aW9uKHgpIGFzLm51bWVyaWMoeFtpXSkpCiAgICAKICAgICMgQ2FsY3VsYXRlIHRoZSBhdmVyYWdlIG9mIFRydWUgYW5kIEV4cGVjdGVkIHZhbHVlcyBmb3IgdGhlIGktdGggcG9zaXRpb24KICAgIGF2ZXJhZ2VfYmlkW2ksIG5dIDwtIG1lYW4oQmlkcywgbmEucm0gPSBUUlVFKQogICAgYXZlcmFnZV9hc2tbaSwgbl0gPC0gbWVhbihBc2tzLCBuYS5ybSA9IFRSVUUpCiAgfQp9CgojIENhbGN1bGF0ZSB0aGUgb3ZlcmFsbCBhdmVyYWdlIGZvciBlYWNoIHBvc2l0aW9uIGFjcm9zcyBhbGwgc2ltdWxhdGlvbnMKb3ZlcmFsbF9hdmVyYWdlX2JpZCA8LSByb3dNZWFucyhhdmVyYWdlX2JpZCwgbmEucm0gPSBUUlVFKQpvdmVyYWxsX2F2ZXJhZ2VfYXNrIDwtIHJvd01lYW5zKGF2ZXJhZ2VfYXNrLCBuYS5ybSA9IFRSVUUpCgojIFBsb3QgdGhlIG92ZXJhbGwgYXZlcmFnZXMKcGxvdChvdmVyYWxsX2F2ZXJhZ2VfYmlkLCB0eXBlID0gImwiLCBwY2ggPSAxNiwgY29sID0gImJsdWUiLCBtYWluID0gIk92ZXJhbGwgQXZlcmFnZSBvZiBCaWRzIHZzIEFza3MiLCB4bGFiID0gIlBvc2l0aW9uIGluIExpc3QiLCB5bGFiID0gIlZhbHVlIiwgeWxpbSA9IGMobWluKGMob3ZlcmFsbF9hdmVyYWdlX2JpZCwgb3ZlcmFsbF9hdmVyYWdlX2FzaykpLCBtYXgoYyhvdmVyYWxsX2F2ZXJhZ2VfYmlkLCBvdmVyYWxsX2F2ZXJhZ2VfYXNrKSkpKQpsaW5lcyhvdmVyYWxsX2F2ZXJhZ2VfYXNrLCB0eXBlID0gImwiLCBwY2ggPSAxNiwgY29sID0gInJlZCIpCmxlZ2VuZCgidG9wcmlnaHQiLCBsZWdlbmQgPSBjKCJCaWRzIiwgIkFza3MiKSwgY29sID0gYygiYmx1ZSIsICJyZWQiKSwgbHR5ID0gMSwgY2V4ID0gMC44KQpgYGAKCgpgYGB7cn0KIyBJbml0aWFsaXplIG1hdHJpY2VzIHRvIHN0b3JlIGF2ZXJhZ2VzIGZvciBlYWNoIHBvc2l0aW9uCmF2ZXJhZ2VfYmlkIDwtIG1hdHJpeChOQSwgbnJvdyA9IDEwMCwgbmNvbCA9IDEwKQphdmVyYWdlX2FzayA8LSBtYXRyaXgoTkEsIG5yb3cgPSAxMDAsIG5jb2wgPSAxMCkKCiMgTG9vcCB0aHJvdWdoIGVhY2ggc2ltdWxhdGlvbiAobikKZm9yIChuIGluIDE6MTApIHsKICAjIEV4dHJhY3QgVHJ1ZSB2YWx1ZXMgZnJvbSB0aGUgYWdncmVnYXRlZF9yZXN1bHRzXzQgZGF0YWZyYW1lCiAgQmlkc19zZXQ2IDwtIHN0cnNwbGl0KGdzdWIoIlxcW3xcXF0iLCAiIiwgdW5saXN0KGFnZ3JlZ2F0ZWRfcmVzdWx0c182W24sIDRdKSksICIsICIpCiAgCiAgIyBFeHRyYWN0IEV4cGVjdGVkIHZhbHVlcyBmcm9tIHRoZSBhZ2dyZWdhdGVkX3Jlc3VsdHNfNCBkYXRhZnJhbWUKICBBc2tzX3NldDYgPC0gc3Ryc3BsaXQoZ3N1YigiXFxbfFxcXSIsICIiLCB1bmxpc3QoYWdncmVnYXRlZF9yZXN1bHRzXzZbbiwgNV0pKSwgIiwgIikKICAKICAjIExvb3AgdGhyb3VnaCBlYWNoIHBvc2l0aW9uIChpKQogIGZvciAoaSBpbiAxOjEwMCkgewogICAgIyBFeHRyYWN0IFRydWUgYW5kIEV4cGVjdGVkIHZhbHVlcyBmb3IgdGhlIGktdGggcG9zaXRpb24KICAgIEJpZHMgPC0gc2FwcGx5KEJpZHNfc2V0NiwgZnVuY3Rpb24oeCkgYXMubnVtZXJpYyh4W2ldKSkKICAgIEFza3MgPC0gc2FwcGx5KEFza3Nfc2V0NiwgZnVuY3Rpb24oeCkgYXMubnVtZXJpYyh4W2ldKSkKICAgIAogICAgIyBDYWxjdWxhdGUgdGhlIGF2ZXJhZ2Ugb2YgVHJ1ZSBhbmQgRXhwZWN0ZWQgdmFsdWVzIGZvciB0aGUgaS10aCBwb3NpdGlvbgogICAgYXZlcmFnZV9iaWRbaSwgbl0gPC0gbWVhbihCaWRzLCBuYS5ybSA9IFRSVUUpCiAgICBhdmVyYWdlX2Fza1tpLCBuXSA8LSBtZWFuKEFza3MsIG5hLnJtID0gVFJVRSkKICB9Cn0KCiMgQ2FsY3VsYXRlIHRoZSBvdmVyYWxsIGF2ZXJhZ2UgZm9yIGVhY2ggcG9zaXRpb24gYWNyb3NzIGFsbCBzaW11bGF0aW9ucwpvdmVyYWxsX2F2ZXJhZ2VfYmlkIDwtIHJvd01lYW5zKGF2ZXJhZ2VfYmlkLCBuYS5ybSA9IFRSVUUpCm92ZXJhbGxfYXZlcmFnZV9hc2sgPC0gcm93TWVhbnMoYXZlcmFnZV9hc2ssIG5hLnJtID0gVFJVRSkKCiMjIFRydWUgVmFsdWUKIyBJbml0aWFsaXplIG1hdHJpY2VzIHRvIHN0b3JlIGF2ZXJhZ2VzIGZvciBlYWNoIHBvc2l0aW9uCmF2ZXJhZ2VfdHJ1ZSA8LSBtYXRyaXgoTkEsIG5yb3cgPSAxMDAsIG5jb2wgPSAxMCkKYXZlcmFnZV9leHBlY3RlZCA8LSBtYXRyaXgoTkEsIG5yb3cgPSAxMDAsIG5jb2wgPSAxMCkKCiMgTG9vcCB0aHJvdWdoIGVhY2ggc2ltdWxhdGlvbiAobikKZm9yIChuIGluIDE6MTApIHsKICAjIEV4dHJhY3QgVHJ1ZSB2YWx1ZXMgZnJvbSB0aGUgYWdncmVnYXRlZF9yZXN1bHRzXzQgZGF0YWZyYW1lCiAgVHJ1ZVZhbHVlc19zZXQ2IDwtIHN0cnNwbGl0KGdzdWIoIlxcW3xcXF0iLCAiIiwgdW5saXN0KGFnZ3JlZ2F0ZWRfcmVzdWx0c182W24sIDJdKSksICIsICIpCiAgCiAgIyBFeHRyYWN0IEV4cGVjdGVkIHZhbHVlcyBmcm9tIHRoZSBhZ2dyZWdhdGVkX3Jlc3VsdHNfNCBkYXRhZnJhbWUKICBFeHBlY3RlZFZhbHVlc19zZXQ2IDwtIHN0cnNwbGl0KGdzdWIoIlxcW3xcXF0iLCAiIiwgdW5saXN0KGFnZ3JlZ2F0ZWRfcmVzdWx0c182W24sIDNdKSksICIsICIpCiAgCiAgIyBMb29wIHRocm91Z2ggZWFjaCBwb3NpdGlvbiAoaSkKICBmb3IgKGkgaW4gMToxMDApIHsKICAgICMgRXh0cmFjdCBUcnVlIGFuZCBFeHBlY3RlZCB2YWx1ZXMgZm9yIHRoZSBpLXRoIHBvc2l0aW9uCiAgICBUcnVlX3ZhbHVlcyA8LSBzYXBwbHkoVHJ1ZVZhbHVlc19zZXQ2LCBmdW5jdGlvbih4KSBhcy5udW1lcmljKHhbaV0pKQogICAgRXhwZWN0ZWRfdmFsdWVzIDwtIHNhcHBseShFeHBlY3RlZFZhbHVlc19zZXQ2LCBmdW5jdGlvbih4KSBhcy5udW1lcmljKHhbaV0pKQogICAgCiAgICAjIENhbGN1bGF0ZSB0aGUgYXZlcmFnZSBvZiBUcnVlIGFuZCBFeHBlY3RlZCB2YWx1ZXMgZm9yIHRoZSBpLXRoIHBvc2l0aW9uCiAgICBhdmVyYWdlX3RydWVbaSwgbl0gPC0gbWVhbihUcnVlX3ZhbHVlcywgbmEucm0gPSBUUlVFKQogICAgYXZlcmFnZV9leHBlY3RlZFtpLCBuXSA8LSBtZWFuKEV4cGVjdGVkX3ZhbHVlcywgbmEucm0gPSBUUlVFKQogIH0KfQoKIyBDYWxjdWxhdGUgdGhlIG92ZXJhbGwgYXZlcmFnZSBmb3IgZWFjaCBwb3NpdGlvbiBhY3Jvc3MgYWxsIHNpbXVsYXRpb25zCm92ZXJhbGxfYXZlcmFnZV90cnVlIDwtIHJvd01lYW5zKGF2ZXJhZ2VfdHJ1ZSwgbmEucm0gPSBUUlVFKQpvdmVyYWxsX2F2ZXJhZ2VfZXhwZWN0ZWQgPC0gcm93TWVhbnMoYXZlcmFnZV9leHBlY3RlZCwgbmEucm0gPSBUUlVFKQoKIyBQbG90IHRoZSBvdmVyYWxsIGF2ZXJhZ2VzCiNwbG90KG92ZXJhbGxfYXZlcmFnZV90cnVlLCB0eXBlID0gImwiLCBwY2ggPSAxNiwgY29sID0gImJsdWUiLCBtYWluID0gIk92ZXJhbGwgQXZlcmFnZSBvZiBUcnVlIHZzIEV4cGVjdGVkIFZhbHVlcyIsIHhsYWIgPSAiUG9zaXRpb24gaW4gTGlzdCIsIHlsYWIgPSAiVmFsdWUiLCB5bGltID0gYyhtaW4oYyhvdmVyYWxsX2F2ZXJhZ2VfdHJ1ZSwgb3ZlcmFsbF9hdmVyYWdlX2V4cGVjdGVkKSksIG1heChjKG92ZXJhbGxfYXZlcmFnZV90cnVlLCBvdmVyYWxsX2F2ZXJhZ2VfZXhwZWN0ZWQpKSkpCiNsaW5lcyhvdmVyYWxsX2F2ZXJhZ2VfZXhwZWN0ZWQsIHR5cGUgPSAibCIsIHBjaCA9IDE2LCBjb2wgPSAicmVkIikKI2xlZ2VuZCgidG9wcmlnaHQiLCBsZWdlbmQgPSBjKCJUcnVlIFZhbHVlcyIsICJFeHBlY3RlZCBWYWx1ZXMiKSwgY29sID0gYygiYmx1ZSIsICJyZWQiKSwgbHR5ID0gMSwgY2V4ID0gMC44KQoKIyBQbG90IHRoZSBvdmVyYWxsIGF2ZXJhZ2VzCnBsb3Qob3ZlcmFsbF9hdmVyYWdlX2JpZCwgdHlwZSA9ICJsIiwgcGNoID0gMTYsIGNvbCA9ICJibHVlIiwgbWFpbiA9ICJPdmVyYWxsIEF2ZXJhZ2Ugb2YgQmlkcyB2cyBBc2tzICYgVHJ1ZSB2cyBFeHBlY3RlZCBWYWx1ZXMiLCB4bGFiID0gIlBvc2l0aW9uIGluIExpc3QiLCB5bGFiID0gIlZhbHVlIiwgeWxpbSA9IGMobWluKGMob3ZlcmFsbF9hdmVyYWdlX2JpZCwgb3ZlcmFsbF9hdmVyYWdlX2Fzaywgb3ZlcmFsbF9hdmVyYWdlX3RydWUsIG92ZXJhbGxfYXZlcmFnZV9leHBlY3RlZCkpLCBtYXgoYyhvdmVyYWxsX2F2ZXJhZ2VfYmlkLCBvdmVyYWxsX2F2ZXJhZ2VfYXNrLCBvdmVyYWxsX2F2ZXJhZ2VfdHJ1ZSwgb3ZlcmFsbF9hdmVyYWdlX2V4cGVjdGVkKSkpKQpsaW5lcyhvdmVyYWxsX2F2ZXJhZ2VfYXNrLCB0eXBlID0gImwiLCBwY2ggPSAxNiwgY29sID0gInJlZCIpCmxpbmVzKG92ZXJhbGxfYXZlcmFnZV90cnVlLCB0eXBlID0gImwiLCBwY2ggPSAxNiwgY29sID0gImdyZWVuIikKbGluZXMob3ZlcmFsbF9hdmVyYWdlX2V4cGVjdGVkLCB0eXBlID0gImwiLCBwY2ggPSAxNiwgY29sID0gInB1cnBsZSIpCmxlZ2VuZCgiYm90dG9tbGVmdCIsIGxlZ2VuZCA9IGMoIkJpZHMiLCAiQXNrcyIsICJUcnVlIFZhbHVlIiwgIkV4cGVjdGVkIFZhbHVlIiksIGNvbCA9IGMoImJsdWUiLCAicmVkIiwgImdyZWVuIiwgInB1cnBsZSIpLCBsdHkgPSAxLCBjZXggPSAwLjgpCmBgYAoKCmBgYHtyfQojIEluaXRpYWxpemUgbWF0cmljZXMgdG8gc3RvcmUgYXZlcmFnZXMgZm9yIGVhY2ggcG9zaXRpb24KYXZlcmFnZV9NTV9wbmwgPC0gbWF0cml4KE5BLCBucm93ID0gMTAwLCBuY29sID0gMTApCmF2ZXJhZ2VfSW5mb3JtZWRfcG5sIDwtIG1hdHJpeChOQSwgbnJvdyA9IDEwMCwgbmNvbCA9IDEwKQphdmVyYWdlX05vaXN5MV9wbmwgPC0gbWF0cml4KE5BLCBucm93ID0gMTAwLCBuY29sID0gMTApCmF2ZXJhZ2VfTm9pc3kyX3BubCA8LSBtYXRyaXgoTkEsIG5yb3cgPSAxMDAsIG5jb2wgPSAxMCkKYXZlcmFnZV9Ob2lzeTNfcG5sIDwtIG1hdHJpeChOQSwgbnJvdyA9IDEwMCwgbmNvbCA9IDEwKQphdmVyYWdlX05vaXN5NF9wbmwgPC0gbWF0cml4KE5BLCBucm93ID0gMTAwLCBuY29sID0gMTApCmF2ZXJhZ2VfTm9pc3k1X3BubCA8LSBtYXRyaXgoTkEsIG5yb3cgPSAxMDAsIG5jb2wgPSAxMCkKCiMgTG9vcCB0aHJvdWdoIGVhY2ggc2ltdWxhdGlvbiAobikKZm9yIChuIGluIDE6MTApIHsKCiAgTU1fcG5sX3NldDYgPC0gc3Ryc3BsaXQoZ3N1YigiXFxbfFxcXSIsICIiLCB1bmxpc3QoYWdncmVnYXRlZF9yZXN1bHRzXzZbbiwgNl0pKSwgIiwgIikKCiAgSW5mb3JtZWRfcG5sX3NldDYgPC0gc3Ryc3BsaXQoZ3N1YigiXFxbfFxcXSIsICIiLCB1bmxpc3QoYWdncmVnYXRlZF9yZXN1bHRzXzZbbiwgOF0pKSwgIiwgIikKICAKICBOb2lzeTFfcG5sX3NldDYgPC0gc3Ryc3BsaXQoZ3N1YigiXFxbfFxcXSIsICIiLCB1bmxpc3QoYWdncmVnYXRlZF9yZXN1bHRzXzZbbiwgMTBdKSksICIsICIpCiAgCiAgTm9pc3kyX3BubF9zZXQ2IDwtIHN0cnNwbGl0KGdzdWIoIlxcW3xcXF0iLCAiIiwgdW5saXN0KGFnZ3JlZ2F0ZWRfcmVzdWx0c182W24sIDEyXSkpLCAiLCAiKQogIAogIE5vaXN5M19wbmxfc2V0NiA8LSBzdHJzcGxpdChnc3ViKCJcXFt8XFxdIiwgIiIsIHVubGlzdChhZ2dyZWdhdGVkX3Jlc3VsdHNfNltuLCAxNF0pKSwgIiwgIikKICAKICBOb2lzeTRfcG5sX3NldDYgPC0gc3Ryc3BsaXQoZ3N1YigiXFxbfFxcXSIsICIiLCB1bmxpc3QoYWdncmVnYXRlZF9yZXN1bHRzXzZbbiwgMTZdKSksICIsICIpCiAgCiAgTm9pc3k1X3BubF9zZXQ2IDwtIHN0cnNwbGl0KGdzdWIoIlxcW3xcXF0iLCAiIiwgdW5saXN0KGFnZ3JlZ2F0ZWRfcmVzdWx0c182W24sIDE4XSkpLCAiLCAiKQogIAogICMgTG9vcCB0aHJvdWdoIGVhY2ggcG9zaXRpb24gKGkpCiAgZm9yIChpIGluIDE6MTAwKSB7CiAgICAjIEV4dHJhY3QgVHJ1ZSBhbmQgRXhwZWN0ZWQgdmFsdWVzIGZvciB0aGUgaS10aCBwb3NpdGlvbgogICAgTU1fcG5sIDwtIHNhcHBseShNTV9wbmxfc2V0NiwgZnVuY3Rpb24oeCkgYXMubnVtZXJpYyh4W2ldKSkKICAgIEluZm9ybWVkX3BubCA8LSBzYXBwbHkoSW5mb3JtZWRfcG5sX3NldDYsIGZ1bmN0aW9uKHgpIGFzLm51bWVyaWMoeFtpXSkpCiAgICBOb2lzeTFfcG5sIDwtIHNhcHBseShOb2lzeTFfcG5sX3NldDYsIGZ1bmN0aW9uKHgpIGFzLm51bWVyaWMoeFtpXSkpCiAgICBOb2lzeTJfcG5sIDwtIHNhcHBseShOb2lzeTJfcG5sX3NldDYsIGZ1bmN0aW9uKHgpIGFzLm51bWVyaWMoeFtpXSkpCiAgICBOb2lzeTNfcG5sIDwtIHNhcHBseShOb2lzeTNfcG5sX3NldDYsIGZ1bmN0aW9uKHgpIGFzLm51bWVyaWMoeFtpXSkpCiAgICBOb2lzeTRfcG5sIDwtIHNhcHBseShOb2lzeTRfcG5sX3NldDYsIGZ1bmN0aW9uKHgpIGFzLm51bWVyaWMoeFtpXSkpCiAgICBOb2lzeTVfcG5sIDwtIHNhcHBseShOb2lzeTVfcG5sX3NldDYsIGZ1bmN0aW9uKHgpIGFzLm51bWVyaWMoeFtpXSkpCiAgICAKICAgICMgQ2FsY3VsYXRlIHRoZSBhdmVyYWdlIG9mIFRydWUgYW5kIEV4cGVjdGVkIHZhbHVlcyBmb3IgdGhlIGktdGggcG9zaXRpb24KICAgIGF2ZXJhZ2VfTU1fcG5sW2ksIG5dIDwtIG1lYW4oTU1fcG5sLCBuYS5ybSA9IFRSVUUpCiAgICBhdmVyYWdlX0luZm9ybWVkX3BubFtpLCBuXSA8LSBtZWFuKEluZm9ybWVkX3BubCwgbmEucm0gPSBUUlVFKQogICAgYXZlcmFnZV9Ob2lzeTFfcG5sW2ksIG5dIDwtIG1lYW4oTm9pc3kxX3BubCwgbmEucm0gPSBUUlVFKQogICAgYXZlcmFnZV9Ob2lzeTJfcG5sW2ksIG5dIDwtIG1lYW4oTm9pc3kyX3BubCwgbmEucm0gPSBUUlVFKQogICAgYXZlcmFnZV9Ob2lzeTNfcG5sW2ksIG5dIDwtIG1lYW4oTm9pc3kzX3BubCwgbmEucm0gPSBUUlVFKQogICAgYXZlcmFnZV9Ob2lzeTRfcG5sW2ksIG5dIDwtIG1lYW4oTm9pc3k0X3BubCwgbmEucm0gPSBUUlVFKQogICAgYXZlcmFnZV9Ob2lzeTVfcG5sW2ksIG5dIDwtIG1lYW4oTm9pc3k1X3BubCwgbmEucm0gPSBUUlVFKQogIH0KfQoKIyBDYWxjdWxhdGUgdGhlIG92ZXJhbGwgYXZlcmFnZSBmb3IgZWFjaCBwb3NpdGlvbiBhY3Jvc3MgYWxsIHNpbXVsYXRpb25zCm92ZXJhbGxfYXZlcmFnZV9NTV9wbmwgPC0gcm93TWVhbnMoYXZlcmFnZV9NTV9wbmwsIG5hLnJtID0gVFJVRSkKb3ZlcmFsbF9hdmVyYWdlX0luZm9ybWVkX3BubCA8LSByb3dNZWFucyhhdmVyYWdlX0luZm9ybWVkX3BubCwgbmEucm0gPSBUUlVFKQpvdmVyYWxsX2F2ZXJhZ2VfTm9pc3kxX3BubCA8LSByb3dNZWFucyhhdmVyYWdlX05vaXN5MV9wbmwsIG5hLnJtID0gVFJVRSkKb3ZlcmFsbF9hdmVyYWdlX05vaXN5Ml9wbmwgPC0gcm93TWVhbnMoYXZlcmFnZV9Ob2lzeTJfcG5sLCBuYS5ybSA9IFRSVUUpCm92ZXJhbGxfYXZlcmFnZV9Ob2lzeTNfcG5sIDwtIHJvd01lYW5zKGF2ZXJhZ2VfTm9pc3kzX3BubCwgbmEucm0gPSBUUlVFKQpvdmVyYWxsX2F2ZXJhZ2VfTm9pc3k0X3BubCA8LSByb3dNZWFucyhhdmVyYWdlX05vaXN5NF9wbmwsIG5hLnJtID0gVFJVRSkKb3ZlcmFsbF9hdmVyYWdlX05vaXN5NV9wbmwgPC0gcm93TWVhbnMoYXZlcmFnZV9Ob2lzeTVfcG5sLCBuYS5ybSA9IFRSVUUpCgojIFBsb3QgdGhlIG92ZXJhbGwgYXZlcmFnZXMKcGxvdChvdmVyYWxsX2F2ZXJhZ2VfTU1fcG5sLCB0eXBlID0gImwiLCBwY2ggPSAxNiwgY29sID0gImJsYWNrIiwgbWFpbiA9ICJPdmVyYWxsIEF2ZXJhZ2UgUE5MIiwgeGxhYiA9ICJQb3NpdGlvbiBpbiBMaXN0IiwgeWxhYiA9ICJWYWx1ZSIsIHlsaW0gPSBjKG1pbihjKG92ZXJhbGxfYXZlcmFnZV9NTV9wbmwsIG92ZXJhbGxfYXZlcmFnZV9JbmZvcm1lZF9wbmwsIG92ZXJhbGxfYXZlcmFnZV9Ob2lzeTFfcG5sLCBvdmVyYWxsX2F2ZXJhZ2VfTm9pc3kyX3BubCwgb3ZlcmFsbF9hdmVyYWdlX05vaXN5M19wbmwsIG92ZXJhbGxfYXZlcmFnZV9Ob2lzeTRfcG5sLCBvdmVyYWxsX2F2ZXJhZ2VfTm9pc3k1X3BubCkpLCBtYXgoYyhvdmVyYWxsX2F2ZXJhZ2VfTU1fcG5sLCBvdmVyYWxsX2F2ZXJhZ2VfSW5mb3JtZWRfcG5sLCBvdmVyYWxsX2F2ZXJhZ2VfTm9pc3kxX3BubCwgb3ZlcmFsbF9hdmVyYWdlX05vaXN5Ml9wbmwsIG92ZXJhbGxfYXZlcmFnZV9Ob2lzeTNfcG5sLCBvdmVyYWxsX2F2ZXJhZ2VfTm9pc3k0X3BubCwgb3ZlcmFsbF9hdmVyYWdlX05vaXN5NV9wbmwpKSkpCmxpbmVzKG92ZXJhbGxfYXZlcmFnZV9JbmZvcm1lZF9wbmwsIHR5cGUgPSAibCIsIHBjaCA9IDE2LCBjb2wgPSAicmVkIikKbGluZXMob3ZlcmFsbF9hdmVyYWdlX05vaXN5MV9wbmwsIHR5cGUgPSAibCIsIHBjaCA9IDE2LCBjb2wgPSAiZ3JlZW4iKQpsaW5lcyhvdmVyYWxsX2F2ZXJhZ2VfTm9pc3kyX3BubCwgdHlwZSA9ICJsIiwgcGNoID0gMTYsIGNvbCA9ICJ5ZWxsb3ciKQpsaW5lcyhvdmVyYWxsX2F2ZXJhZ2VfTm9pc3kzX3BubCwgdHlwZSA9ICJsIiwgcGNoID0gMTYsIGNvbCA9ICJibHVlIikKbGluZXMob3ZlcmFsbF9hdmVyYWdlX05vaXN5NF9wbmwsIHR5cGUgPSAibCIsIHBjaCA9IDE2LCBjb2wgPSAicHVycGxlIikKbGluZXMob3ZlcmFsbF9hdmVyYWdlX05vaXN5NV9wbmwsIHR5cGUgPSAibCIsIHBjaCA9IDE2LCBjb2wgPSAib3JhbmdlIikKCiMgQWRkIGxlZ2VuZApsZWdlbmQoImJvdHRvbWxlZnQiLCBsZWdlbmQgPSBjKCJNYXJrZXQgTWFrZXIiLCAiSW5mb3JtZWQiLCAiTm9pc3kgMSIsICJOb2lzeSAyIiwgIk5vaXN5IDMiLCAiTm9pc3kgNCIsICJOb2lzeSA1IiksIGNvbCA9IGMoImJsYWNrIiwgInJlZCIsICJncmVlbiIsICJ5ZWxsb3ciLCAiYmx1ZSIsICJwdXJwbGUiLCAib3JhbmdlIiksIGx0eSA9IDEsIGNleCA9IDAuOCkKYGBgCgoKYGBge3J9CiMgSW5pdGlhbGl6ZSBtYXRyaWNlcyB0byBzdG9yZSBhdmVyYWdlcyBmb3IgZWFjaCBwb3NpdGlvbgphdmVyYWdlX01NX3BvcyA8LSBtYXRyaXgoTkEsIG5yb3cgPSAxMDAsIG5jb2wgPSAxMCkKYXZlcmFnZV9JbmZvcm1lZF9wb3MgPC0gbWF0cml4KE5BLCBucm93ID0gMTAwLCBuY29sID0gMTApCmF2ZXJhZ2VfTm9pc3kxX3BvcyA8LSBtYXRyaXgoTkEsIG5yb3cgPSAxMDAsIG5jb2wgPSAxMCkKYXZlcmFnZV9Ob2lzeTJfcG9zIDwtIG1hdHJpeChOQSwgbnJvdyA9IDEwMCwgbmNvbCA9IDEwKQphdmVyYWdlX05vaXN5M19wb3MgPC0gbWF0cml4KE5BLCBucm93ID0gMTAwLCBuY29sID0gMTApCmF2ZXJhZ2VfTm9pc3k0X3BvcyA8LSBtYXRyaXgoTkEsIG5yb3cgPSAxMDAsIG5jb2wgPSAxMCkKYXZlcmFnZV9Ob2lzeTVfcG9zIDwtIG1hdHJpeChOQSwgbnJvdyA9IDEwMCwgbmNvbCA9IDEwKQoKIyBMb29wIHRocm91Z2ggZWFjaCBzaW11bGF0aW9uIChuKQpmb3IgKG4gaW4gMToxMCkgewoKICBNTV9wb3Nfc2V0NiA8LSBzdHJzcGxpdChnc3ViKCJcXFt8XFxdIiwgIiIsIHVubGlzdChhZ2dyZWdhdGVkX3Jlc3VsdHNfNltuLCA3XSkpLCAiLCAiKQoKICBJbmZvcm1lZF9wb3Nfc2V0NiA8LSBzdHJzcGxpdChnc3ViKCJcXFt8XFxdIiwgIiIsIHVubGlzdChhZ2dyZWdhdGVkX3Jlc3VsdHNfNltuLCA5XSkpLCAiLCAiKQogIAogIE5vaXN5MV9wb3Nfc2V0NiA8LSBzdHJzcGxpdChnc3ViKCJcXFt8XFxdIiwgIiIsIHVubGlzdChhZ2dyZWdhdGVkX3Jlc3VsdHNfNltuLCAxMV0pKSwgIiwgIikKICAKICBOb2lzeTJfcG9zX3NldDYgPC0gc3Ryc3BsaXQoZ3N1YigiXFxbfFxcXSIsICIiLCB1bmxpc3QoYWdncmVnYXRlZF9yZXN1bHRzXzZbbiwgMTNdKSksICIsICIpCiAgCiAgTm9pc3kzX3Bvc19zZXQ2IDwtIHN0cnNwbGl0KGdzdWIoIlxcW3xcXF0iLCAiIiwgdW5saXN0KGFnZ3JlZ2F0ZWRfcmVzdWx0c182W24sIDE1XSkpLCAiLCAiKQogIAogIE5vaXN5NF9wb3Nfc2V0NiA8LSBzdHJzcGxpdChnc3ViKCJcXFt8XFxdIiwgIiIsIHVubGlzdChhZ2dyZWdhdGVkX3Jlc3VsdHNfNltuLCAxN10pKSwgIiwgIikKICAKICBOb2lzeTVfcG9zX3NldDYgPC0gc3Ryc3BsaXQoZ3N1YigiXFxbfFxcXSIsICIiLCB1bmxpc3QoYWdncmVnYXRlZF9yZXN1bHRzXzZbbiwgMTldKSksICIsICIpCiAgCiAgIyBMb29wIHRocm91Z2ggZWFjaCBwb3NpdGlvbiAoaSkKICBmb3IgKGkgaW4gMToxMDApIHsKICAgICMgRXh0cmFjdCBUcnVlIGFuZCBFeHBlY3RlZCB2YWx1ZXMgZm9yIHRoZSBpLXRoIHBvc2l0aW9uCiAgICBNTV9wb3MgPC0gc2FwcGx5KE1NX3Bvc19zZXQ2LCBmdW5jdGlvbih4KSBhcy5udW1lcmljKHhbaV0pKQogICAgSW5mb3JtZWRfcG9zIDwtIHNhcHBseShJbmZvcm1lZF9wbmxfc2V0NiwgZnVuY3Rpb24oeCkgYXMubnVtZXJpYyh4W2ldKSkKICAgIE5vaXN5MV9wb3MgPC0gc2FwcGx5KE5vaXN5MV9wb3Nfc2V0NiwgZnVuY3Rpb24oeCkgYXMubnVtZXJpYyh4W2ldKSkKICAgIE5vaXN5Ml9wb3MgPC0gc2FwcGx5KE5vaXN5Ml9wb3Nfc2V0NiwgZnVuY3Rpb24oeCkgYXMubnVtZXJpYyh4W2ldKSkKICAgIE5vaXN5M19wb3MgPC0gc2FwcGx5KE5vaXN5M19wb3Nfc2V0NiwgZnVuY3Rpb24oeCkgYXMubnVtZXJpYyh4W2ldKSkKICAgIE5vaXN5NF9wb3MgPC0gc2FwcGx5KE5vaXN5NF9wb3Nfc2V0NiwgZnVuY3Rpb24oeCkgYXMubnVtZXJpYyh4W2ldKSkKICAgIE5vaXN5NV9wb3MgPC0gc2FwcGx5KE5vaXN5NV9wb3Nfc2V0NiwgZnVuY3Rpb24oeCkgYXMubnVtZXJpYyh4W2ldKSkKICAgIAogICAgIyBDYWxjdWxhdGUgdGhlIGF2ZXJhZ2Ugb2YgVHJ1ZSBhbmQgRXhwZWN0ZWQgdmFsdWVzIGZvciB0aGUgaS10aCBwb3NpdGlvbgogICAgYXZlcmFnZV9NTV9wb3NbaSwgbl0gPC0gbWVhbihNTV9wb3MsIG5hLnJtID0gVFJVRSkKICAgIGF2ZXJhZ2VfSW5mb3JtZWRfcG9zW2ksIG5dIDwtIG1lYW4oSW5mb3JtZWRfcG9zLCBuYS5ybSA9IFRSVUUpCiAgICBhdmVyYWdlX05vaXN5MV9wb3NbaSwgbl0gPC0gbWVhbihOb2lzeTFfcG9zLCBuYS5ybSA9IFRSVUUpCiAgICBhdmVyYWdlX05vaXN5Ml9wb3NbaSwgbl0gPC0gbWVhbihOb2lzeTJfcG9zLCBuYS5ybSA9IFRSVUUpCiAgICBhdmVyYWdlX05vaXN5M19wb3NbaSwgbl0gPC0gbWVhbihOb2lzeTNfcG9zLCBuYS5ybSA9IFRSVUUpCiAgICBhdmVyYWdlX05vaXN5NF9wb3NbaSwgbl0gPC0gbWVhbihOb2lzeTRfcG9zLCBuYS5ybSA9IFRSVUUpCiAgICBhdmVyYWdlX05vaXN5NV9wb3NbaSwgbl0gPC0gbWVhbihOb2lzeTVfcG9zLCBuYS5ybSA9IFRSVUUpCiAgfQp9CgojIENhbGN1bGF0ZSB0aGUgb3ZlcmFsbCBhdmVyYWdlIGZvciBlYWNoIHBvc2l0aW9uIGFjcm9zcyBhbGwgc2ltdWxhdGlvbnMKb3ZlcmFsbF9hdmVyYWdlX01NX3BvcyA8LSByb3dNZWFucyhhdmVyYWdlX01NX3BvcywgbmEucm0gPSBUUlVFKQpvdmVyYWxsX2F2ZXJhZ2VfSW5mb3JtZWRfcG9zIDwtIHJvd01lYW5zKGF2ZXJhZ2VfSW5mb3JtZWRfcG9zLCBuYS5ybSA9IFRSVUUpCm92ZXJhbGxfYXZlcmFnZV9Ob2lzeTFfcG9zIDwtIHJvd01lYW5zKGF2ZXJhZ2VfTm9pc3kxX3BvcywgbmEucm0gPSBUUlVFKQpvdmVyYWxsX2F2ZXJhZ2VfTm9pc3kyX3BvcyA8LSByb3dNZWFucyhhdmVyYWdlX05vaXN5Ml9wb3MsIG5hLnJtID0gVFJVRSkKb3ZlcmFsbF9hdmVyYWdlX05vaXN5M19wb3MgPC0gcm93TWVhbnMoYXZlcmFnZV9Ob2lzeTNfcG9zLCBuYS5ybSA9IFRSVUUpCm92ZXJhbGxfYXZlcmFnZV9Ob2lzeTRfcG9zIDwtIHJvd01lYW5zKGF2ZXJhZ2VfTm9pc3k0X3BvcywgbmEucm0gPSBUUlVFKQpvdmVyYWxsX2F2ZXJhZ2VfTm9pc3k1X3BvcyA8LSByb3dNZWFucyhhdmVyYWdlX05vaXN5NV9wb3MsIG5hLnJtID0gVFJVRSkKCiMgUGxvdCB0aGUgb3ZlcmFsbCBhdmVyYWdlcwpwbG90KG92ZXJhbGxfYXZlcmFnZV9NTV9wb3MsIHR5cGUgPSAibCIsIHBjaCA9IDE2LCBjb2wgPSAiYmxhY2siLCBtYWluID0gIk92ZXJhbGwgQXZlcmFnZSBQb3NpdGlvbiIsIHhsYWIgPSAiUG9zaXRpb24gaW4gTGlzdCIsIHlsYWIgPSAiVmFsdWUiLCB5bGltID0gYyhtaW4oYyhvdmVyYWxsX2F2ZXJhZ2VfTU1fcG9zLCBvdmVyYWxsX2F2ZXJhZ2VfSW5mb3JtZWRfcG9zLCBvdmVyYWxsX2F2ZXJhZ2VfTm9pc3kxX3Bvcywgb3ZlcmFsbF9hdmVyYWdlX05vaXN5Ml9wb3MsIG92ZXJhbGxfYXZlcmFnZV9Ob2lzeTNfcG9zLCBvdmVyYWxsX2F2ZXJhZ2VfTm9pc3k0X3Bvcywgb3ZlcmFsbF9hdmVyYWdlX05vaXN5NV9wb3MpKSwgbWF4KGMob3ZlcmFsbF9hdmVyYWdlX01NX3Bvcywgb3ZlcmFsbF9hdmVyYWdlX0luZm9ybWVkX3Bvcywgb3ZlcmFsbF9hdmVyYWdlX05vaXN5MV9wb3MsIG92ZXJhbGxfYXZlcmFnZV9Ob2lzeTJfcG9zLCBvdmVyYWxsX2F2ZXJhZ2VfTm9pc3kzX3Bvcywgb3ZlcmFsbF9hdmVyYWdlX05vaXN5NF9wb3MsIG92ZXJhbGxfYXZlcmFnZV9Ob2lzeTVfcG9zKSkpKQpsaW5lcyhvdmVyYWxsX2F2ZXJhZ2VfSW5mb3JtZWRfcG9zLCB0eXBlID0gImwiLCBwY2ggPSAxNiwgY29sID0gInJlZCIpCmxpbmVzKG92ZXJhbGxfYXZlcmFnZV9Ob2lzeTFfcG9zLCB0eXBlID0gImwiLCBwY2ggPSAxNiwgY29sID0gImdyZWVuIikKbGluZXMob3ZlcmFsbF9hdmVyYWdlX05vaXN5Ml9wb3MsIHR5cGUgPSAibCIsIHBjaCA9IDE2LCBjb2wgPSAieWVsbG93IikKbGluZXMob3ZlcmFsbF9hdmVyYWdlX05vaXN5M19wb3MsIHR5cGUgPSAibCIsIHBjaCA9IDE2LCBjb2wgPSAiYmx1ZSIpCmxpbmVzKG92ZXJhbGxfYXZlcmFnZV9Ob2lzeTRfcG9zLCB0eXBlID0gImwiLCBwY2ggPSAxNiwgY29sID0gInB1cnBsZSIpCmxpbmVzKG92ZXJhbGxfYXZlcmFnZV9Ob2lzeTVfcG9zLCB0eXBlID0gImwiLCBwY2ggPSAxNiwgY29sID0gIm9yYW5nZSIpCgojIEFkZCBsZWdlbmQKbGVnZW5kKCJ0b3BsZWZ0IiwgbGVnZW5kID0gYygiTWFya2V0IE1ha2VyIiwgIkluZm9ybWVkIiwgIk5vaXN5IDEiLCAiTm9pc3kgMiIsICJOb2lzeSAzIiwgIk5vaXN5IDQiLCAiTm9pc3kgNSIpLCBjb2wgPSBjKCJibGFjayIsICJyZWQiLCAiZ3JlZW4iLCAieWVsbG93IiwgImJsdWUiLCAicHVycGxlIiwgIm9yYW5nZSIpLCBsdHkgPSAxLCBjZXggPSAwLjgpCmBgYAoKCiMjIHNldDcgKDEgaW5mb3JtZWQgKyA1IG5vaXN5IGluZm9ybWVkKQoKYGBge3J9CiMgSW5pdGlhbGl6ZSBtYXRyaWNlcyB0byBzdG9yZSBhdmVyYWdlcyBmb3IgZWFjaCBwb3NpdGlvbgphdmVyYWdlX3RydWUgPC0gbWF0cml4KE5BLCBucm93ID0gMTAwLCBuY29sID0gMTApCmF2ZXJhZ2VfZXhwZWN0ZWQgPC0gbWF0cml4KE5BLCBucm93ID0gMTAwLCBuY29sID0gMTApCgojIExvb3AgdGhyb3VnaCBlYWNoIHNpbXVsYXRpb24gKG4pCmZvciAobiBpbiAxOjEwKSB7CiAgIyBFeHRyYWN0IFRydWUgdmFsdWVzIGZyb20gdGhlIGFnZ3JlZ2F0ZWRfcmVzdWx0c180IGRhdGFmcmFtZQogIFRydWVWYWx1ZXNfc2V0NyA8LSBzdHJzcGxpdChnc3ViKCJcXFt8XFxdIiwgIiIsIHVubGlzdChhZ2dyZWdhdGVkX3Jlc3VsdHNfN1tuLCAyXSkpLCAiLCAiKQogIAogICMgRXh0cmFjdCBFeHBlY3RlZCB2YWx1ZXMgZnJvbSB0aGUgYWdncmVnYXRlZF9yZXN1bHRzXzQgZGF0YWZyYW1lCiAgRXhwZWN0ZWRWYWx1ZXNfc2V0NyA8LSBzdHJzcGxpdChnc3ViKCJcXFt8XFxdIiwgIiIsIHVubGlzdChhZ2dyZWdhdGVkX3Jlc3VsdHNfN1tuLCAzXSkpLCAiLCAiKQogIAogICMgTG9vcCB0aHJvdWdoIGVhY2ggcG9zaXRpb24gKGkpCiAgZm9yIChpIGluIDE6MTAwKSB7CiAgICAjIEV4dHJhY3QgVHJ1ZSBhbmQgRXhwZWN0ZWQgdmFsdWVzIGZvciB0aGUgaS10aCBwb3NpdGlvbgogICAgVHJ1ZV92YWx1ZXMgPC0gc2FwcGx5KFRydWVWYWx1ZXNfc2V0NywgZnVuY3Rpb24oeCkgYXMubnVtZXJpYyh4W2ldKSkKICAgIEV4cGVjdGVkX3ZhbHVlcyA8LSBzYXBwbHkoRXhwZWN0ZWRWYWx1ZXNfc2V0NywgZnVuY3Rpb24oeCkgYXMubnVtZXJpYyh4W2ldKSkKICAgIAogICAgIyBDYWxjdWxhdGUgdGhlIGF2ZXJhZ2Ugb2YgVHJ1ZSBhbmQgRXhwZWN0ZWQgdmFsdWVzIGZvciB0aGUgaS10aCBwb3NpdGlvbgogICAgYXZlcmFnZV90cnVlW2ksIG5dIDwtIG1lYW4oVHJ1ZV92YWx1ZXMsIG5hLnJtID0gVFJVRSkKICAgIGF2ZXJhZ2VfZXhwZWN0ZWRbaSwgbl0gPC0gbWVhbihFeHBlY3RlZF92YWx1ZXMsIG5hLnJtID0gVFJVRSkKICB9Cn0KCiMgQ2FsY3VsYXRlIHRoZSBvdmVyYWxsIGF2ZXJhZ2UgZm9yIGVhY2ggcG9zaXRpb24gYWNyb3NzIGFsbCBzaW11bGF0aW9ucwpvdmVyYWxsX2F2ZXJhZ2VfdHJ1ZSA8LSByb3dNZWFucyhhdmVyYWdlX3RydWUsIG5hLnJtID0gVFJVRSkKb3ZlcmFsbF9hdmVyYWdlX2V4cGVjdGVkIDwtIHJvd01lYW5zKGF2ZXJhZ2VfZXhwZWN0ZWQsIG5hLnJtID0gVFJVRSkKCiMgUGxvdCB0aGUgb3ZlcmFsbCBhdmVyYWdlcwpwbG90KG92ZXJhbGxfYXZlcmFnZV90cnVlLCB0eXBlID0gImwiLCBwY2ggPSAxNiwgY29sID0gImJsdWUiLCBtYWluID0gIk92ZXJhbGwgQXZlcmFnZSBvZiBUcnVlIHZzIEV4cGVjdGVkIFZhbHVlcyIsIHhsYWIgPSAiUG9zaXRpb24gaW4gTGlzdCIsIHlsYWIgPSAiVmFsdWUiLCB5bGltID0gYyhtaW4oYyhvdmVyYWxsX2F2ZXJhZ2VfdHJ1ZSwgb3ZlcmFsbF9hdmVyYWdlX2V4cGVjdGVkKSksIG1heChjKG92ZXJhbGxfYXZlcmFnZV90cnVlLCBvdmVyYWxsX2F2ZXJhZ2VfZXhwZWN0ZWQpKSkpCmxpbmVzKG92ZXJhbGxfYXZlcmFnZV9leHBlY3RlZCwgdHlwZSA9ICJsIiwgcGNoID0gMTYsIGNvbCA9ICJyZWQiKQpsZWdlbmQoInRvcHJpZ2h0IiwgbGVnZW5kID0gYygiVHJ1ZSBWYWx1ZXMiLCAiRXhwZWN0ZWQgVmFsdWVzIiksIGNvbCA9IGMoImJsdWUiLCAicmVkIiksIGx0eSA9IDEsIGNleCA9IDAuOCkKYGBgCgoKYGBge3J9CiMgSW5pdGlhbGl6ZSBtYXRyaWNlcyB0byBzdG9yZSBhdmVyYWdlcyBmb3IgZWFjaCBwb3NpdGlvbgphdmVyYWdlX2JpZCA8LSBtYXRyaXgoTkEsIG5yb3cgPSAxMDAsIG5jb2wgPSAxMCkKYXZlcmFnZV9hc2sgPC0gbWF0cml4KE5BLCBucm93ID0gMTAwLCBuY29sID0gMTApCgojIExvb3AgdGhyb3VnaCBlYWNoIHNpbXVsYXRpb24gKG4pCmZvciAobiBpbiAxOjEwKSB7CiAgIyBFeHRyYWN0IFRydWUgdmFsdWVzIGZyb20gdGhlIGFnZ3JlZ2F0ZWRfcmVzdWx0c180IGRhdGFmcmFtZQogIEJpZHNfc2V0NyA8LSBzdHJzcGxpdChnc3ViKCJcXFt8XFxdIiwgIiIsIHVubGlzdChhZ2dyZWdhdGVkX3Jlc3VsdHNfN1tuLCA0XSkpLCAiLCAiKQogIAogICMgRXh0cmFjdCBFeHBlY3RlZCB2YWx1ZXMgZnJvbSB0aGUgYWdncmVnYXRlZF9yZXN1bHRzXzQgZGF0YWZyYW1lCiAgQXNrc19zZXQ3IDwtIHN0cnNwbGl0KGdzdWIoIlxcW3xcXF0iLCAiIiwgdW5saXN0KGFnZ3JlZ2F0ZWRfcmVzdWx0c183W24sIDVdKSksICIsICIpCiAgCiAgIyBMb29wIHRocm91Z2ggZWFjaCBwb3NpdGlvbiAoaSkKICBmb3IgKGkgaW4gMToxMDApIHsKICAgICMgRXh0cmFjdCBUcnVlIGFuZCBFeHBlY3RlZCB2YWx1ZXMgZm9yIHRoZSBpLXRoIHBvc2l0aW9uCiAgICBCaWRzIDwtIHNhcHBseShCaWRzX3NldDcsIGZ1bmN0aW9uKHgpIGFzLm51bWVyaWMoeFtpXSkpCiAgICBBc2tzIDwtIHNhcHBseShBc2tzX3NldDcsIGZ1bmN0aW9uKHgpIGFzLm51bWVyaWMoeFtpXSkpCiAgICAKICAgICMgQ2FsY3VsYXRlIHRoZSBhdmVyYWdlIG9mIFRydWUgYW5kIEV4cGVjdGVkIHZhbHVlcyBmb3IgdGhlIGktdGggcG9zaXRpb24KICAgIGF2ZXJhZ2VfYmlkW2ksIG5dIDwtIG1lYW4oQmlkcywgbmEucm0gPSBUUlVFKQogICAgYXZlcmFnZV9hc2tbaSwgbl0gPC0gbWVhbihBc2tzLCBuYS5ybSA9IFRSVUUpCiAgfQp9CgojIENhbGN1bGF0ZSB0aGUgb3ZlcmFsbCBhdmVyYWdlIGZvciBlYWNoIHBvc2l0aW9uIGFjcm9zcyBhbGwgc2ltdWxhdGlvbnMKb3ZlcmFsbF9hdmVyYWdlX2JpZCA8LSByb3dNZWFucyhhdmVyYWdlX2JpZCwgbmEucm0gPSBUUlVFKQpvdmVyYWxsX2F2ZXJhZ2VfYXNrIDwtIHJvd01lYW5zKGF2ZXJhZ2VfYXNrLCBuYS5ybSA9IFRSVUUpCgojIFBsb3QgdGhlIG92ZXJhbGwgYXZlcmFnZXMKcGxvdChvdmVyYWxsX2F2ZXJhZ2VfYmlkLCB0eXBlID0gImwiLCBwY2ggPSAxNiwgY29sID0gImJsdWUiLCBtYWluID0gIk92ZXJhbGwgQXZlcmFnZSBvZiBCaWRzIHZzIEFza3MiLCB4bGFiID0gIlBvc2l0aW9uIGluIExpc3QiLCB5bGFiID0gIlZhbHVlIiwgeWxpbSA9IGMobWluKGMob3ZlcmFsbF9hdmVyYWdlX2JpZCwgb3ZlcmFsbF9hdmVyYWdlX2FzaykpLCBtYXgoYyhvdmVyYWxsX2F2ZXJhZ2VfYmlkLCBvdmVyYWxsX2F2ZXJhZ2VfYXNrKSkpKQpsaW5lcyhvdmVyYWxsX2F2ZXJhZ2VfYXNrLCB0eXBlID0gImwiLCBwY2ggPSAxNiwgY29sID0gInJlZCIpCmxlZ2VuZCgidG9wcmlnaHQiLCBsZWdlbmQgPSBjKCJCaWRzIiwgIkFza3MiKSwgY29sID0gYygiYmx1ZSIsICJyZWQiKSwgbHR5ID0gMSwgY2V4ID0gMC44KQpgYGAKCmBgYHtyfQojIEluaXRpYWxpemUgbWF0cmljZXMgdG8gc3RvcmUgYXZlcmFnZXMgZm9yIGVhY2ggcG9zaXRpb24KYXZlcmFnZV9iaWQgPC0gbWF0cml4KE5BLCBucm93ID0gMTAwLCBuY29sID0gMTApCmF2ZXJhZ2VfYXNrIDwtIG1hdHJpeChOQSwgbnJvdyA9IDEwMCwgbmNvbCA9IDEwKQoKIyBMb29wIHRocm91Z2ggZWFjaCBzaW11bGF0aW9uIChuKQpmb3IgKG4gaW4gMToxMCkgewogICMgRXh0cmFjdCBUcnVlIHZhbHVlcyBmcm9tIHRoZSBhZ2dyZWdhdGVkX3Jlc3VsdHNfNCBkYXRhZnJhbWUKICBCaWRzX3NldDcgPC0gc3Ryc3BsaXQoZ3N1YigiXFxbfFxcXSIsICIiLCB1bmxpc3QoYWdncmVnYXRlZF9yZXN1bHRzXzdbbiwgNF0pKSwgIiwgIikKICAKICAjIEV4dHJhY3QgRXhwZWN0ZWQgdmFsdWVzIGZyb20gdGhlIGFnZ3JlZ2F0ZWRfcmVzdWx0c180IGRhdGFmcmFtZQogIEFza3Nfc2V0NyA8LSBzdHJzcGxpdChnc3ViKCJcXFt8XFxdIiwgIiIsIHVubGlzdChhZ2dyZWdhdGVkX3Jlc3VsdHNfN1tuLCA1XSkpLCAiLCAiKQogIAogICMgTG9vcCB0aHJvdWdoIGVhY2ggcG9zaXRpb24gKGkpCiAgZm9yIChpIGluIDE6MTAwKSB7CiAgICAjIEV4dHJhY3QgVHJ1ZSBhbmQgRXhwZWN0ZWQgdmFsdWVzIGZvciB0aGUgaS10aCBwb3NpdGlvbgogICAgQmlkcyA8LSBzYXBwbHkoQmlkc19zZXQ3LCBmdW5jdGlvbih4KSBhcy5udW1lcmljKHhbaV0pKQogICAgQXNrcyA8LSBzYXBwbHkoQXNrc19zZXQ3LCBmdW5jdGlvbih4KSBhcy5udW1lcmljKHhbaV0pKQogICAgCiAgICAjIENhbGN1bGF0ZSB0aGUgYXZlcmFnZSBvZiBUcnVlIGFuZCBFeHBlY3RlZCB2YWx1ZXMgZm9yIHRoZSBpLXRoIHBvc2l0aW9uCiAgICBhdmVyYWdlX2JpZFtpLCBuXSA8LSBtZWFuKEJpZHMsIG5hLnJtID0gVFJVRSkKICAgIGF2ZXJhZ2VfYXNrW2ksIG5dIDwtIG1lYW4oQXNrcywgbmEucm0gPSBUUlVFKQogIH0KfQoKIyBDYWxjdWxhdGUgdGhlIG92ZXJhbGwgYXZlcmFnZSBmb3IgZWFjaCBwb3NpdGlvbiBhY3Jvc3MgYWxsIHNpbXVsYXRpb25zCm92ZXJhbGxfYXZlcmFnZV9iaWQgPC0gcm93TWVhbnMoYXZlcmFnZV9iaWQsIG5hLnJtID0gVFJVRSkKb3ZlcmFsbF9hdmVyYWdlX2FzayA8LSByb3dNZWFucyhhdmVyYWdlX2FzaywgbmEucm0gPSBUUlVFKQoKIyMgVHJ1ZSBWYWx1ZQojIEluaXRpYWxpemUgbWF0cmljZXMgdG8gc3RvcmUgYXZlcmFnZXMgZm9yIGVhY2ggcG9zaXRpb24KYXZlcmFnZV90cnVlIDwtIG1hdHJpeChOQSwgbnJvdyA9IDEwMCwgbmNvbCA9IDEwKQphdmVyYWdlX2V4cGVjdGVkIDwtIG1hdHJpeChOQSwgbnJvdyA9IDEwMCwgbmNvbCA9IDEwKQoKIyBMb29wIHRocm91Z2ggZWFjaCBzaW11bGF0aW9uIChuKQpmb3IgKG4gaW4gMToxMCkgewogICMgRXh0cmFjdCBUcnVlIHZhbHVlcyBmcm9tIHRoZSBhZ2dyZWdhdGVkX3Jlc3VsdHNfNCBkYXRhZnJhbWUKICBUcnVlVmFsdWVzX3NldDcgPC0gc3Ryc3BsaXQoZ3N1YigiXFxbfFxcXSIsICIiLCB1bmxpc3QoYWdncmVnYXRlZF9yZXN1bHRzXzdbbiwgMl0pKSwgIiwgIikKICAKICAjIEV4dHJhY3QgRXhwZWN0ZWQgdmFsdWVzIGZyb20gdGhlIGFnZ3JlZ2F0ZWRfcmVzdWx0c180IGRhdGFmcmFtZQogIEV4cGVjdGVkVmFsdWVzX3NldDcgPC0gc3Ryc3BsaXQoZ3N1YigiXFxbfFxcXSIsICIiLCB1bmxpc3QoYWdncmVnYXRlZF9yZXN1bHRzXzdbbiwgM10pKSwgIiwgIikKICAKICAjIExvb3AgdGhyb3VnaCBlYWNoIHBvc2l0aW9uIChpKQogIGZvciAoaSBpbiAxOjEwMCkgewogICAgIyBFeHRyYWN0IFRydWUgYW5kIEV4cGVjdGVkIHZhbHVlcyBmb3IgdGhlIGktdGggcG9zaXRpb24KICAgIFRydWVfdmFsdWVzIDwtIHNhcHBseShUcnVlVmFsdWVzX3NldDcsIGZ1bmN0aW9uKHgpIGFzLm51bWVyaWMoeFtpXSkpCiAgICBFeHBlY3RlZF92YWx1ZXMgPC0gc2FwcGx5KEV4cGVjdGVkVmFsdWVzX3NldDcsIGZ1bmN0aW9uKHgpIGFzLm51bWVyaWMoeFtpXSkpCiAgICAKICAgICMgQ2FsY3VsYXRlIHRoZSBhdmVyYWdlIG9mIFRydWUgYW5kIEV4cGVjdGVkIHZhbHVlcyBmb3IgdGhlIGktdGggcG9zaXRpb24KICAgIGF2ZXJhZ2VfdHJ1ZVtpLCBuXSA8LSBtZWFuKFRydWVfdmFsdWVzLCBuYS5ybSA9IFRSVUUpCiAgICBhdmVyYWdlX2V4cGVjdGVkW2ksIG5dIDwtIG1lYW4oRXhwZWN0ZWRfdmFsdWVzLCBuYS5ybSA9IFRSVUUpCiAgfQp9CgojIENhbGN1bGF0ZSB0aGUgb3ZlcmFsbCBhdmVyYWdlIGZvciBlYWNoIHBvc2l0aW9uIGFjcm9zcyBhbGwgc2ltdWxhdGlvbnMKb3ZlcmFsbF9hdmVyYWdlX3RydWUgPC0gcm93TWVhbnMoYXZlcmFnZV90cnVlLCBuYS5ybSA9IFRSVUUpCm92ZXJhbGxfYXZlcmFnZV9leHBlY3RlZCA8LSByb3dNZWFucyhhdmVyYWdlX2V4cGVjdGVkLCBuYS5ybSA9IFRSVUUpCgojIFBsb3QgdGhlIG92ZXJhbGwgYXZlcmFnZXMKI3Bsb3Qob3ZlcmFsbF9hdmVyYWdlX3RydWUsIHR5cGUgPSAibCIsIHBjaCA9IDE2LCBjb2wgPSAiYmx1ZSIsIG1haW4gPSAiT3ZlcmFsbCBBdmVyYWdlIG9mIFRydWUgdnMgRXhwZWN0ZWQgVmFsdWVzIiwgeGxhYiA9ICJQb3NpdGlvbiBpbiBMaXN0IiwgeWxhYiA9ICJWYWx1ZSIsIHlsaW0gPSBjKG1pbihjKG92ZXJhbGxfYXZlcmFnZV90cnVlLCBvdmVyYWxsX2F2ZXJhZ2VfZXhwZWN0ZWQpKSwgbWF4KGMob3ZlcmFsbF9hdmVyYWdlX3RydWUsIG92ZXJhbGxfYXZlcmFnZV9leHBlY3RlZCkpKSkKI2xpbmVzKG92ZXJhbGxfYXZlcmFnZV9leHBlY3RlZCwgdHlwZSA9ICJsIiwgcGNoID0gMTYsIGNvbCA9ICJyZWQiKQojbGVnZW5kKCJ0b3ByaWdodCIsIGxlZ2VuZCA9IGMoIlRydWUgVmFsdWVzIiwgIkV4cGVjdGVkIFZhbHVlcyIpLCBjb2wgPSBjKCJibHVlIiwgInJlZCIpLCBsdHkgPSAxLCBjZXggPSAwLjgpCgojIFBsb3QgdGhlIG92ZXJhbGwgYXZlcmFnZXMKcGxvdChvdmVyYWxsX2F2ZXJhZ2VfYmlkLCB0eXBlID0gImwiLCBwY2ggPSAxNiwgY29sID0gImJsdWUiLCBtYWluID0gIk92ZXJhbGwgQXZlcmFnZSBvZiBCaWRzIHZzIEFza3MgJiBUcnVlIHZzIEV4cGVjdGVkIFZhbHVlcyIsIHhsYWIgPSAiUG9zaXRpb24gaW4gTGlzdCIsIHlsYWIgPSAiVmFsdWUiLCB5bGltID0gYyhtaW4oYyhvdmVyYWxsX2F2ZXJhZ2VfYmlkLCBvdmVyYWxsX2F2ZXJhZ2VfYXNrLCBvdmVyYWxsX2F2ZXJhZ2VfdHJ1ZSwgb3ZlcmFsbF9hdmVyYWdlX2V4cGVjdGVkKSksIG1heChjKG92ZXJhbGxfYXZlcmFnZV9iaWQsIG92ZXJhbGxfYXZlcmFnZV9hc2ssIG92ZXJhbGxfYXZlcmFnZV90cnVlLCBvdmVyYWxsX2F2ZXJhZ2VfZXhwZWN0ZWQpKSkpCmxpbmVzKG92ZXJhbGxfYXZlcmFnZV9hc2ssIHR5cGUgPSAibCIsIHBjaCA9IDE2LCBjb2wgPSAicmVkIikKbGluZXMob3ZlcmFsbF9hdmVyYWdlX3RydWUsIHR5cGUgPSAibCIsIHBjaCA9IDE2LCBjb2wgPSAiZ3JlZW4iKQpsaW5lcyhvdmVyYWxsX2F2ZXJhZ2VfZXhwZWN0ZWQsIHR5cGUgPSAibCIsIHBjaCA9IDE2LCBjb2wgPSAicHVycGxlIikKbGVnZW5kKCJib3R0b21sZWZ0IiwgbGVnZW5kID0gYygiQmlkcyIsICJBc2tzIiwgIlRydWUgVmFsdWUiLCAiRXhwZWN0ZWQgVmFsdWUiKSwgY29sID0gYygiYmx1ZSIsICJyZWQiLCAiZ3JlZW4iLCAicHVycGxlIiksIGx0eSA9IDEsIGNleCA9IDAuOCkKYGBgCgoKYGBge3J9CiMgSW5pdGlhbGl6ZSBtYXRyaWNlcyB0byBzdG9yZSBhdmVyYWdlcyBmb3IgZWFjaCBwb3NpdGlvbgphdmVyYWdlX01NX3BubCA8LSBtYXRyaXgoTkEsIG5yb3cgPSAxMDAsIG5jb2wgPSAxMCkKYXZlcmFnZV9JbmZvcm1lZF9wbmwgPC0gbWF0cml4KE5BLCBucm93ID0gMTAwLCBuY29sID0gMTApCmF2ZXJhZ2VfTm9pc3lJbmZvcm1lZDFfcG5sIDwtIG1hdHJpeChOQSwgbnJvdyA9IDEwMCwgbmNvbCA9IDEwKQphdmVyYWdlX05vaXN5SW5mb3JtZWQyX3BubCA8LSBtYXRyaXgoTkEsIG5yb3cgPSAxMDAsIG5jb2wgPSAxMCkKYXZlcmFnZV9Ob2lzeUluZm9ybWVkM19wbmwgPC0gbWF0cml4KE5BLCBucm93ID0gMTAwLCBuY29sID0gMTApCmF2ZXJhZ2VfTm9pc3lJbmZvcm1lZDRfcG5sIDwtIG1hdHJpeChOQSwgbnJvdyA9IDEwMCwgbmNvbCA9IDEwKQphdmVyYWdlX05vaXN5SW5mb3JtZWQ1X3BubCA8LSBtYXRyaXgoTkEsIG5yb3cgPSAxMDAsIG5jb2wgPSAxMCkKCiMgTG9vcCB0aHJvdWdoIGVhY2ggc2ltdWxhdGlvbiAobikKZm9yIChuIGluIDE6MTApIHsKCiAgTU1fcG5sX3NldDcgPC0gc3Ryc3BsaXQoZ3N1YigiXFxbfFxcXSIsICIiLCB1bmxpc3QoYWdncmVnYXRlZF9yZXN1bHRzXzdbbiwgNl0pKSwgIiwgIikKCiAgSW5mb3JtZWRfcG5sX3NldDcgPC0gc3Ryc3BsaXQoZ3N1YigiXFxbfFxcXSIsICIiLCB1bmxpc3QoYWdncmVnYXRlZF9yZXN1bHRzXzdbbiwgOF0pKSwgIiwgIikKICAKICBOb2lzeUluZm9ybWVkMV9wbmxfc2V0NyA8LSBzdHJzcGxpdChnc3ViKCJcXFt8XFxdIiwgIiIsIHVubGlzdChhZ2dyZWdhdGVkX3Jlc3VsdHNfN1tuLCAxMF0pKSwgIiwgIikKICAKICBOb2lzeUluZm9ybWVkMl9wbmxfc2V0NyA8LSBzdHJzcGxpdChnc3ViKCJcXFt8XFxdIiwgIiIsIHVubGlzdChhZ2dyZWdhdGVkX3Jlc3VsdHNfN1tuLCAxMl0pKSwgIiwgIikKICAKICBOb2lzeUluZm9ybWVkM19wbmxfc2V0NyA8LSBzdHJzcGxpdChnc3ViKCJcXFt8XFxdIiwgIiIsIHVubGlzdChhZ2dyZWdhdGVkX3Jlc3VsdHNfN1tuLCAxNF0pKSwgIiwgIikKICAKICBOb2lzeUluZm9ybWVkNF9wbmxfc2V0NyA8LSBzdHJzcGxpdChnc3ViKCJcXFt8XFxdIiwgIiIsIHVubGlzdChhZ2dyZWdhdGVkX3Jlc3VsdHNfN1tuLCAxNl0pKSwgIiwgIikKICAKICBOb2lzeUluZm9ybWVkNV9wbmxfc2V0NyA8LSBzdHJzcGxpdChnc3ViKCJcXFt8XFxdIiwgIiIsIHVubGlzdChhZ2dyZWdhdGVkX3Jlc3VsdHNfN1tuLCAxOF0pKSwgIiwgIikKICAKICAjIExvb3AgdGhyb3VnaCBlYWNoIHBvc2l0aW9uIChpKQogIGZvciAoaSBpbiAxOjEwMCkgewogICAgIyBFeHRyYWN0IFRydWUgYW5kIEV4cGVjdGVkIHZhbHVlcyBmb3IgdGhlIGktdGggcG9zaXRpb24KICAgIE1NX3BubCA8LSBzYXBwbHkoTU1fcG5sX3NldDcsIGZ1bmN0aW9uKHgpIGFzLm51bWVyaWMoeFtpXSkpCiAgICBJbmZvcm1lZF9wbmwgPC0gc2FwcGx5KEluZm9ybWVkX3BubF9zZXQ3LCBmdW5jdGlvbih4KSBhcy5udW1lcmljKHhbaV0pKQogICAgTm9pc3lJbmZvcm1lZDFfcG5sIDwtIHNhcHBseShOb2lzeUluZm9ybWVkMV9wbmxfc2V0NywgZnVuY3Rpb24oeCkgYXMubnVtZXJpYyh4W2ldKSkKICAgIE5vaXN5SW5mb3JtZWQyX3BubCA8LSBzYXBwbHkoTm9pc3lJbmZvcm1lZDJfcG5sX3NldDcsIGZ1bmN0aW9uKHgpIGFzLm51bWVyaWMoeFtpXSkpCiAgICBOb2lzeUluZm9ybWVkM19wbmwgPC0gc2FwcGx5KE5vaXN5SW5mb3JtZWQzX3BubF9zZXQ3LCBmdW5jdGlvbih4KSBhcy5udW1lcmljKHhbaV0pKQogICAgTm9pc3lJbmZvcm1lZDRfcG5sIDwtIHNhcHBseShOb2lzeUluZm9ybWVkNF9wbmxfc2V0NywgZnVuY3Rpb24oeCkgYXMubnVtZXJpYyh4W2ldKSkKICAgIE5vaXN5SW5mb3JtZWQ1X3BubCA8LSBzYXBwbHkoTm9pc3lJbmZvcm1lZDVfcG5sX3NldDcsIGZ1bmN0aW9uKHgpIGFzLm51bWVyaWMoeFtpXSkpCiAgICAKICAgICMgQ2FsY3VsYXRlIHRoZSBhdmVyYWdlIG9mIFRydWUgYW5kIEV4cGVjdGVkIHZhbHVlcyBmb3IgdGhlIGktdGggcG9zaXRpb24KICAgIGF2ZXJhZ2VfTU1fcG5sW2ksIG5dIDwtIG1lYW4oTU1fcG5sLCBuYS5ybSA9IFRSVUUpCiAgICBhdmVyYWdlX0luZm9ybWVkX3BubFtpLCBuXSA8LSBtZWFuKEluZm9ybWVkX3BubCwgbmEucm0gPSBUUlVFKQogICAgYXZlcmFnZV9Ob2lzeUluZm9ybWVkMV9wbmxbaSwgbl0gPC0gbWVhbihOb2lzeUluZm9ybWVkMV9wbmwsIG5hLnJtID0gVFJVRSkKICAgIGF2ZXJhZ2VfTm9pc3lJbmZvcm1lZDJfcG5sW2ksIG5dIDwtIG1lYW4oTm9pc3lJbmZvcm1lZDJfcG5sLCBuYS5ybSA9IFRSVUUpCiAgICBhdmVyYWdlX05vaXN5SW5mb3JtZWQzX3BubFtpLCBuXSA8LSBtZWFuKE5vaXN5SW5mb3JtZWQzX3BubCwgbmEucm0gPSBUUlVFKQogICAgYXZlcmFnZV9Ob2lzeUluZm9ybWVkNF9wbmxbaSwgbl0gPC0gbWVhbihOb2lzeUluZm9ybWVkNF9wbmwsIG5hLnJtID0gVFJVRSkKICAgIGF2ZXJhZ2VfTm9pc3lJbmZvcm1lZDVfcG5sW2ksIG5dIDwtIG1lYW4oTm9pc3lJbmZvcm1lZDVfcG5sLCBuYS5ybSA9IFRSVUUpCiAgfQp9CgojIENhbGN1bGF0ZSB0aGUgb3ZlcmFsbCBhdmVyYWdlIGZvciBlYWNoIHBvc2l0aW9uIGFjcm9zcyBhbGwgc2ltdWxhdGlvbnMKb3ZlcmFsbF9hdmVyYWdlX01NX3BubCA8LSByb3dNZWFucyhhdmVyYWdlX01NX3BubCwgbmEucm0gPSBUUlVFKQpvdmVyYWxsX2F2ZXJhZ2VfSW5mb3JtZWRfcG5sIDwtIHJvd01lYW5zKGF2ZXJhZ2VfSW5mb3JtZWRfcG5sLCBuYS5ybSA9IFRSVUUpCm92ZXJhbGxfYXZlcmFnZV9Ob2lzeUluZm9ybWVkMV9wbmwgPC0gcm93TWVhbnMoYXZlcmFnZV9Ob2lzeUluZm9ybWVkMV9wbmwsIG5hLnJtID0gVFJVRSkKb3ZlcmFsbF9hdmVyYWdlX05vaXN5SW5mb3JtZWQyX3BubCA8LSByb3dNZWFucyhhdmVyYWdlX05vaXN5SW5mb3JtZWQyX3BubCwgbmEucm0gPSBUUlVFKQpvdmVyYWxsX2F2ZXJhZ2VfTm9pc3lJbmZvcm1lZDNfcG5sIDwtIHJvd01lYW5zKGF2ZXJhZ2VfTm9pc3lJbmZvcm1lZDNfcG5sLCBuYS5ybSA9IFRSVUUpCm92ZXJhbGxfYXZlcmFnZV9Ob2lzeUluZm9ybWVkNF9wbmwgPC0gcm93TWVhbnMoYXZlcmFnZV9Ob2lzeUluZm9ybWVkNF9wbmwsIG5hLnJtID0gVFJVRSkKb3ZlcmFsbF9hdmVyYWdlX05vaXN5SW5mb3JtZWQ1X3BubCA8LSByb3dNZWFucyhhdmVyYWdlX05vaXN5SW5mb3JtZWQ1X3BubCwgbmEucm0gPSBUUlVFKQoKIyBQbG90IHRoZSBvdmVyYWxsIGF2ZXJhZ2VzCnBsb3Qob3ZlcmFsbF9hdmVyYWdlX01NX3BubCwgdHlwZSA9ICJsIiwgcGNoID0gMTYsIGNvbCA9ICJibGFjayIsIG1haW4gPSAiT3ZlcmFsbCBBdmVyYWdlIFBOTCIsIHhsYWIgPSAiUG9zaXRpb24gaW4gTGlzdCIsIHlsYWIgPSAiVmFsdWUiLCB5bGltID0gYyhtaW4oYyhvdmVyYWxsX2F2ZXJhZ2VfTU1fcG5sLCBvdmVyYWxsX2F2ZXJhZ2VfSW5mb3JtZWRfcG5sLCBvdmVyYWxsX2F2ZXJhZ2VfTm9pc3lJbmZvcm1lZDFfcG5sLCBvdmVyYWxsX2F2ZXJhZ2VfTm9pc3lJbmZvcm1lZDJfcG5sLCBvdmVyYWxsX2F2ZXJhZ2VfTm9pc3lJbmZvcm1lZDNfcG5sLCBvdmVyYWxsX2F2ZXJhZ2VfTm9pc3lJbmZvcm1lZDRfcG5sLCBvdmVyYWxsX2F2ZXJhZ2VfTm9pc3lJbmZvcm1lZDVfcG5sKSksIG1heChjKG92ZXJhbGxfYXZlcmFnZV9NTV9wbmwsIG92ZXJhbGxfYXZlcmFnZV9JbmZvcm1lZF9wbmwsIG92ZXJhbGxfYXZlcmFnZV9Ob2lzeUluZm9ybWVkMV9wbmwsIG92ZXJhbGxfYXZlcmFnZV9Ob2lzeUluZm9ybWVkMl9wbmwsIG92ZXJhbGxfYXZlcmFnZV9Ob2lzeUluZm9ybWVkM19wbmwsIG92ZXJhbGxfYXZlcmFnZV9Ob2lzeUluZm9ybWVkNF9wbmwsIG92ZXJhbGxfYXZlcmFnZV9Ob2lzeUluZm9ybWVkNV9wbmwpKSkpCmxpbmVzKG92ZXJhbGxfYXZlcmFnZV9JbmZvcm1lZF9wbmwsIHR5cGUgPSAibCIsIHBjaCA9IDE2LCBjb2wgPSAicmVkIikKbGluZXMob3ZlcmFsbF9hdmVyYWdlX05vaXN5SW5mb3JtZWQxX3BubCwgdHlwZSA9ICJsIiwgcGNoID0gMTYsIGNvbCA9ICJncmVlbiIpCmxpbmVzKG92ZXJhbGxfYXZlcmFnZV9Ob2lzeUluZm9ybWVkMl9wbmwsIHR5cGUgPSAibCIsIHBjaCA9IDE2LCBjb2wgPSAieWVsbG93IikKbGluZXMob3ZlcmFsbF9hdmVyYWdlX05vaXN5SW5mb3JtZWQzX3BubCwgdHlwZSA9ICJsIiwgcGNoID0gMTYsIGNvbCA9ICJibHVlIikKbGluZXMob3ZlcmFsbF9hdmVyYWdlX05vaXN5SW5mb3JtZWQ0X3BubCwgdHlwZSA9ICJsIiwgcGNoID0gMTYsIGNvbCA9ICJwdXJwbGUiKQpsaW5lcyhvdmVyYWxsX2F2ZXJhZ2VfTm9pc3lJbmZvcm1lZDVfcG5sLCB0eXBlID0gImwiLCBwY2ggPSAxNiwgY29sID0gIm9yYW5nZSIpCgojIEFkZCBsZWdlbmQKbGVnZW5kKCJib3R0b21sZWZ0IiwgbGVnZW5kID0gYygiTWFya2V0IE1ha2VyIiwgIkluZm9ybWVkIiwgIk5vaXN5IEluZm9ybWVkIDEiLCAiTm9pc3kgSW5mb3JtZWQgMiIsICJOb2lzeSBJbmZvcm1lZCAzIiwgIk5vaXN5IEluZm9ybWVkIDQiLCAiTm9pc3kgSW5mb3JtZWQgNSIpLCBjb2wgPSBjKCJibGFjayIsICJyZWQiLCAiZ3JlZW4iLCAieWVsbG93IiwgImJsdWUiLCAicHVycGxlIiwgIm9yYW5nZSIpLCBsdHkgPSAxLCBjZXggPSAwLjgpCmBgYAoKYGBge3J9CiMgSW5pdGlhbGl6ZSBtYXRyaWNlcyB0byBzdG9yZSBhdmVyYWdlcyBmb3IgZWFjaCBwb3NpdGlvbgphdmVyYWdlX01NX3BvcyA8LSBtYXRyaXgoTkEsIG5yb3cgPSAxMDAsIG5jb2wgPSAxMCkKYXZlcmFnZV9JbmZvcm1lZF9wb3MgPC0gbWF0cml4KE5BLCBucm93ID0gMTAwLCBuY29sID0gMTApCmF2ZXJhZ2VfTm9pc3lJbmZvcm1lZDFfcG9zIDwtIG1hdHJpeChOQSwgbnJvdyA9IDEwMCwgbmNvbCA9IDEwKQphdmVyYWdlX05vaXN5SW5mb3JtZWQyX3BvcyA8LSBtYXRyaXgoTkEsIG5yb3cgPSAxMDAsIG5jb2wgPSAxMCkKYXZlcmFnZV9Ob2lzeUluZm9ybWVkM19wb3MgPC0gbWF0cml4KE5BLCBucm93ID0gMTAwLCBuY29sID0gMTApCmF2ZXJhZ2VfTm9pc3lJbmZvcm1lZDRfcG9zIDwtIG1hdHJpeChOQSwgbnJvdyA9IDEwMCwgbmNvbCA9IDEwKQphdmVyYWdlX05vaXN5SW5mb3JtZWQ1X3BvcyA8LSBtYXRyaXgoTkEsIG5yb3cgPSAxMDAsIG5jb2wgPSAxMCkKCiMgTG9vcCB0aHJvdWdoIGVhY2ggc2ltdWxhdGlvbiAobikKZm9yIChuIGluIDE6MTApIHsKCiAgTU1fcG9zX3NldDcgPC0gc3Ryc3BsaXQoZ3N1YigiXFxbfFxcXSIsICIiLCB1bmxpc3QoYWdncmVnYXRlZF9yZXN1bHRzXzdbbiwgN10pKSwgIiwgIikKCiAgSW5mb3JtZWRfcG9zX3NldDcgPC0gc3Ryc3BsaXQoZ3N1YigiXFxbfFxcXSIsICIiLCB1bmxpc3QoYWdncmVnYXRlZF9yZXN1bHRzXzdbbiwgOV0pKSwgIiwgIikKICAKICBOb2lzeUluZm9ybWVkMV9wb3Nfc2V0NyA8LSBzdHJzcGxpdChnc3ViKCJcXFt8XFxdIiwgIiIsIHVubGlzdChhZ2dyZWdhdGVkX3Jlc3VsdHNfN1tuLCAxMV0pKSwgIiwgIikKICAKICBOb2lzeUluZm9ybWVkMl9wb3Nfc2V0NyA8LSBzdHJzcGxpdChnc3ViKCJcXFt8XFxdIiwgIiIsIHVubGlzdChhZ2dyZWdhdGVkX3Jlc3VsdHNfN1tuLCAxM10pKSwgIiwgIikKICAKICBOb2lzeUluZm9ybWVkM19wb3Nfc2V0NyA8LSBzdHJzcGxpdChnc3ViKCJcXFt8XFxdIiwgIiIsIHVubGlzdChhZ2dyZWdhdGVkX3Jlc3VsdHNfN1tuLCAxNV0pKSwgIiwgIikKICAKICBOb2lzeUluZm9ybWVkNF9wb3Nfc2V0NyA8LSBzdHJzcGxpdChnc3ViKCJcXFt8XFxdIiwgIiIsIHVubGlzdChhZ2dyZWdhdGVkX3Jlc3VsdHNfN1tuLCAxN10pKSwgIiwgIikKICAKICBOb2lzeUluZm9ybWVkNV9wb3Nfc2V0NyA8LSBzdHJzcGxpdChnc3ViKCJcXFt8XFxdIiwgIiIsIHVubGlzdChhZ2dyZWdhdGVkX3Jlc3VsdHNfN1tuLCAxOV0pKSwgIiwgIikKICAKICAjIExvb3AgdGhyb3VnaCBlYWNoIHBvc2l0aW9uIChpKQogIGZvciAoaSBpbiAxOjEwMCkgewogICAgIyBFeHRyYWN0IFRydWUgYW5kIEV4cGVjdGVkIHZhbHVlcyBmb3IgdGhlIGktdGggcG9zaXRpb24KICAgIE1NX3BvcyA8LSBzYXBwbHkoTU1fcG9zX3NldDcsIGZ1bmN0aW9uKHgpIGFzLm51bWVyaWMoeFtpXSkpCiAgICBJbmZvcm1lZF9wb3MgPC0gc2FwcGx5KEluZm9ybWVkX3Bvc19zZXQ3LCBmdW5jdGlvbih4KSBhcy5udW1lcmljKHhbaV0pKQogICAgTm9pc3lJbmZvcm1lZDFfcG9zIDwtIHNhcHBseShOb2lzeUluZm9ybWVkMV9wb3Nfc2V0NywgZnVuY3Rpb24oeCkgYXMubnVtZXJpYyh4W2ldKSkKICAgIE5vaXN5SW5mb3JtZWQyX3BvcyA8LSBzYXBwbHkoTm9pc3lJbmZvcm1lZDJfcG9zX3NldDcsIGZ1bmN0aW9uKHgpIGFzLm51bWVyaWMoeFtpXSkpCiAgICBOb2lzeUluZm9ybWVkM19wb3MgPC0gc2FwcGx5KE5vaXN5SW5mb3JtZWQzX3Bvc19zZXQ3LCBmdW5jdGlvbih4KSBhcy5udW1lcmljKHhbaV0pKQogICAgTm9pc3lJbmZvcm1lZDRfcG9zIDwtIHNhcHBseShOb2lzeUluZm9ybWVkNF9wb3Nfc2V0NywgZnVuY3Rpb24oeCkgYXMubnVtZXJpYyh4W2ldKSkKICAgIE5vaXN5SW5mb3JtZWQ1X3BvcyA8LSBzYXBwbHkoTm9pc3lJbmZvcm1lZDVfcG9zX3NldDcsIGZ1bmN0aW9uKHgpIGFzLm51bWVyaWMoeFtpXSkpCiAgICAKICAgICMgQ2FsY3VsYXRlIHRoZSBhdmVyYWdlIG9mIFRydWUgYW5kIEV4cGVjdGVkIHZhbHVlcyBmb3IgdGhlIGktdGggcG9zaXRpb24KICAgIGF2ZXJhZ2VfTU1fcG9zW2ksIG5dIDwtIG1lYW4oTU1fcG9zLCBuYS5ybSA9IFRSVUUpCiAgICBhdmVyYWdlX0luZm9ybWVkX3Bvc1tpLCBuXSA8LSBtZWFuKEluZm9ybWVkX3BvcywgbmEucm0gPSBUUlVFKQogICAgYXZlcmFnZV9Ob2lzeUluZm9ybWVkMV9wb3NbaSwgbl0gPC0gbWVhbihOb2lzeUluZm9ybWVkMV9wb3MsIG5hLnJtID0gVFJVRSkKICAgIGF2ZXJhZ2VfTm9pc3lJbmZvcm1lZDJfcG9zW2ksIG5dIDwtIG1lYW4oTm9pc3lJbmZvcm1lZDJfcG9zLCBuYS5ybSA9IFRSVUUpCiAgICBhdmVyYWdlX05vaXN5SW5mb3JtZWQzX3Bvc1tpLCBuXSA8LSBtZWFuKE5vaXN5SW5mb3JtZWQzX3BvcywgbmEucm0gPSBUUlVFKQogICAgYXZlcmFnZV9Ob2lzeUluZm9ybWVkNF9wb3NbaSwgbl0gPC0gbWVhbihOb2lzeUluZm9ybWVkNF9wb3MsIG5hLnJtID0gVFJVRSkKICAgIGF2ZXJhZ2VfTm9pc3lJbmZvcm1lZDVfcG9zW2ksIG5dIDwtIG1lYW4oTm9pc3lJbmZvcm1lZDVfcG9zLCBuYS5ybSA9IFRSVUUpCiAgfQp9CgojIENhbGN1bGF0ZSB0aGUgb3ZlcmFsbCBhdmVyYWdlIGZvciBlYWNoIHBvc2l0aW9uIGFjcm9zcyBhbGwgc2ltdWxhdGlvbnMKb3ZlcmFsbF9hdmVyYWdlX01NX3BvcyA8LSByb3dNZWFucyhhdmVyYWdlX01NX3BvcywgbmEucm0gPSBUUlVFKQpvdmVyYWxsX2F2ZXJhZ2VfSW5mb3JtZWRfcG9zIDwtIHJvd01lYW5zKGF2ZXJhZ2VfSW5mb3JtZWRfcG9zLCBuYS5ybSA9IFRSVUUpCm92ZXJhbGxfYXZlcmFnZV9Ob2lzeUluZm9ybWVkMV9wb3MgPC0gcm93TWVhbnMoYXZlcmFnZV9Ob2lzeUluZm9ybWVkMV9wb3MsIG5hLnJtID0gVFJVRSkKb3ZlcmFsbF9hdmVyYWdlX05vaXN5SW5mb3JtZWQyX3BvcyA8LSByb3dNZWFucyhhdmVyYWdlX05vaXN5SW5mb3JtZWQyX3BvcywgbmEucm0gPSBUUlVFKQpvdmVyYWxsX2F2ZXJhZ2VfTm9pc3lJbmZvcm1lZDNfcG9zIDwtIHJvd01lYW5zKGF2ZXJhZ2VfTm9pc3lJbmZvcm1lZDNfcG9zLCBuYS5ybSA9IFRSVUUpCm92ZXJhbGxfYXZlcmFnZV9Ob2lzeUluZm9ybWVkNF9wb3MgPC0gcm93TWVhbnMoYXZlcmFnZV9Ob2lzeUluZm9ybWVkNF9wb3MsIG5hLnJtID0gVFJVRSkKb3ZlcmFsbF9hdmVyYWdlX05vaXN5SW5mb3JtZWQ1X3BvcyA8LSByb3dNZWFucyhhdmVyYWdlX05vaXN5SW5mb3JtZWQ1X3BvcywgbmEucm0gPSBUUlVFKQoKIyBQbG90IHRoZSBvdmVyYWxsIGF2ZXJhZ2VzCnBsb3Qob3ZlcmFsbF9hdmVyYWdlX01NX3BvcywgdHlwZSA9ICJsIiwgcGNoID0gMTYsIGNvbCA9ICJibGFjayIsIG1haW4gPSAiT3ZlcmFsbCBBdmVyYWdlIFBvc2l0aW9uIiwgeGxhYiA9ICJQb3NpdGlvbiBpbiBMaXN0IiwgeWxhYiA9ICJWYWx1ZSIsIHlsaW0gPSBjKG1pbihjKG92ZXJhbGxfYXZlcmFnZV9NTV9wb3MsIG92ZXJhbGxfYXZlcmFnZV9JbmZvcm1lZF9wb3MsIG92ZXJhbGxfYXZlcmFnZV9Ob2lzeUluZm9ybWVkMV9wb3MsIG92ZXJhbGxfYXZlcmFnZV9Ob2lzeUluZm9ybWVkMl9wb3MsIG92ZXJhbGxfYXZlcmFnZV9Ob2lzeUluZm9ybWVkM19wb3MsIG92ZXJhbGxfYXZlcmFnZV9Ob2lzeUluZm9ybWVkNF9wb3MsIG92ZXJhbGxfYXZlcmFnZV9Ob2lzeUluZm9ybWVkNV9wb3MpKSwgbWF4KGMob3ZlcmFsbF9hdmVyYWdlX01NX3Bvcywgb3ZlcmFsbF9hdmVyYWdlX0luZm9ybWVkX3Bvcywgb3ZlcmFsbF9hdmVyYWdlX05vaXN5SW5mb3JtZWQxX3Bvcywgb3ZlcmFsbF9hdmVyYWdlX05vaXN5SW5mb3JtZWQyX3Bvcywgb3ZlcmFsbF9hdmVyYWdlX05vaXN5SW5mb3JtZWQzX3Bvcywgb3ZlcmFsbF9hdmVyYWdlX05vaXN5SW5mb3JtZWQ0X3Bvcywgb3ZlcmFsbF9hdmVyYWdlX05vaXN5SW5mb3JtZWQ1X3BvcykpKSkKbGluZXMob3ZlcmFsbF9hdmVyYWdlX0luZm9ybWVkX3BvcywgdHlwZSA9ICJsIiwgcGNoID0gMTYsIGNvbCA9ICJyZWQiKQpsaW5lcyhvdmVyYWxsX2F2ZXJhZ2VfTm9pc3lJbmZvcm1lZDFfcG9zLCB0eXBlID0gImwiLCBwY2ggPSAxNiwgY29sID0gImdyZWVuIikKbGluZXMob3ZlcmFsbF9hdmVyYWdlX05vaXN5SW5mb3JtZWQyX3BvcywgdHlwZSA9ICJsIiwgcGNoID0gMTYsIGNvbCA9ICJ5ZWxsb3ciKQpsaW5lcyhvdmVyYWxsX2F2ZXJhZ2VfTm9pc3lJbmZvcm1lZDNfcG9zLCB0eXBlID0gImwiLCBwY2ggPSAxNiwgY29sID0gImJsdWUiKQpsaW5lcyhvdmVyYWxsX2F2ZXJhZ2VfTm9pc3lJbmZvcm1lZDRfcG9zLCB0eXBlID0gImwiLCBwY2ggPSAxNiwgY29sID0gInB1cnBsZSIpCmxpbmVzKG92ZXJhbGxfYXZlcmFnZV9Ob2lzeUluZm9ybWVkNV9wb3MsIHR5cGUgPSAibCIsIHBjaCA9IDE2LCBjb2wgPSAib3JhbmdlIikKCiMgQWRkIGxlZ2VuZApsZWdlbmQoImJvdHRvbWxlZnQiLCBsZWdlbmQgPSBjKCJNYXJrZXQgTWFrZXIiLCAiSW5mb3JtZWQiLCAiTm9pc3kgSW5mb3JtZWQgMSIsICJOb2lzeSBJbmZvcm1lZCAyIiwgIk5vaXN5IEluZm9ybWVkIDMiLCAiTm9pc3kgSW5mb3JtZWQgNCIsICJOb2lzeSBJbmZvcm1lZCA1IiksIGNvbCA9IGMoImJsYWNrIiwgInJlZCIsICJncmVlbiIsICJ5ZWxsb3ciLCAiYmx1ZSIsICJwdXJwbGUiLCAib3JhbmdlIiksIGx0eSA9IDEsIGNleCA9IDAuOCkKYGBgCgoKCiMjIHNldDggKDEgaW5mb3JtZWQgKyAyIG5vaXN5IGluZm9ybWVkICsgMyBub2lzeSkKCmBgYHtyfQojIEluaXRpYWxpemUgbWF0cmljZXMgdG8gc3RvcmUgYXZlcmFnZXMgZm9yIGVhY2ggcG9zaXRpb24KYXZlcmFnZV90cnVlIDwtIG1hdHJpeChOQSwgbnJvdyA9IDEwMCwgbmNvbCA9IDEwKQphdmVyYWdlX2V4cGVjdGVkIDwtIG1hdHJpeChOQSwgbnJvdyA9IDEwMCwgbmNvbCA9IDEwKQoKIyBMb29wIHRocm91Z2ggZWFjaCBzaW11bGF0aW9uIChuKQpmb3IgKG4gaW4gMToxMCkgewogICMgRXh0cmFjdCBUcnVlIHZhbHVlcyBmcm9tIHRoZSBhZ2dyZWdhdGVkX3Jlc3VsdHNfNCBkYXRhZnJhbWUKICBUcnVlVmFsdWVzX3NldDggPC0gc3Ryc3BsaXQoZ3N1YigiXFxbfFxcXSIsICIiLCB1bmxpc3QoYWdncmVnYXRlZF9yZXN1bHRzXzhbbiwgMl0pKSwgIiwgIikKICAKICAjIEV4dHJhY3QgRXhwZWN0ZWQgdmFsdWVzIGZyb20gdGhlIGFnZ3JlZ2F0ZWRfcmVzdWx0c180IGRhdGFmcmFtZQogIEV4cGVjdGVkVmFsdWVzX3NldDggPC0gc3Ryc3BsaXQoZ3N1YigiXFxbfFxcXSIsICIiLCB1bmxpc3QoYWdncmVnYXRlZF9yZXN1bHRzXzhbbiwgM10pKSwgIiwgIikKICAKICAjIExvb3AgdGhyb3VnaCBlYWNoIHBvc2l0aW9uIChpKQogIGZvciAoaSBpbiAxOjEwMCkgewogICAgIyBFeHRyYWN0IFRydWUgYW5kIEV4cGVjdGVkIHZhbHVlcyBmb3IgdGhlIGktdGggcG9zaXRpb24KICAgIFRydWVfdmFsdWVzIDwtIHNhcHBseShUcnVlVmFsdWVzX3NldDgsIGZ1bmN0aW9uKHgpIGFzLm51bWVyaWMoeFtpXSkpCiAgICBFeHBlY3RlZF92YWx1ZXMgPC0gc2FwcGx5KEV4cGVjdGVkVmFsdWVzX3NldDgsIGZ1bmN0aW9uKHgpIGFzLm51bWVyaWMoeFtpXSkpCiAgICAKICAgICMgQ2FsY3VsYXRlIHRoZSBhdmVyYWdlIG9mIFRydWUgYW5kIEV4cGVjdGVkIHZhbHVlcyBmb3IgdGhlIGktdGggcG9zaXRpb24KICAgIGF2ZXJhZ2VfdHJ1ZVtpLCBuXSA8LSBtZWFuKFRydWVfdmFsdWVzLCBuYS5ybSA9IFRSVUUpCiAgICBhdmVyYWdlX2V4cGVjdGVkW2ksIG5dIDwtIG1lYW4oRXhwZWN0ZWRfdmFsdWVzLCBuYS5ybSA9IFRSVUUpCiAgfQp9CgojIENhbGN1bGF0ZSB0aGUgb3ZlcmFsbCBhdmVyYWdlIGZvciBlYWNoIHBvc2l0aW9uIGFjcm9zcyBhbGwgc2ltdWxhdGlvbnMKb3ZlcmFsbF9hdmVyYWdlX3RydWUgPC0gcm93TWVhbnMoYXZlcmFnZV90cnVlLCBuYS5ybSA9IFRSVUUpCm92ZXJhbGxfYXZlcmFnZV9leHBlY3RlZCA8LSByb3dNZWFucyhhdmVyYWdlX2V4cGVjdGVkLCBuYS5ybSA9IFRSVUUpCgojIFBsb3QgdGhlIG92ZXJhbGwgYXZlcmFnZXMKcGxvdChvdmVyYWxsX2F2ZXJhZ2VfdHJ1ZSwgdHlwZSA9ICJsIiwgcGNoID0gMTYsIGNvbCA9ICJibHVlIiwgbWFpbiA9ICJPdmVyYWxsIEF2ZXJhZ2Ugb2YgVHJ1ZSB2cyBFeHBlY3RlZCBWYWx1ZXMiLCB4bGFiID0gIlBvc2l0aW9uIGluIExpc3QiLCB5bGFiID0gIlZhbHVlIiwgeWxpbSA9IGMobWluKGMob3ZlcmFsbF9hdmVyYWdlX3RydWUsIG92ZXJhbGxfYXZlcmFnZV9leHBlY3RlZCkpLCBtYXgoYyhvdmVyYWxsX2F2ZXJhZ2VfdHJ1ZSwgb3ZlcmFsbF9hdmVyYWdlX2V4cGVjdGVkKSkpKQpsaW5lcyhvdmVyYWxsX2F2ZXJhZ2VfZXhwZWN0ZWQsIHR5cGUgPSAibCIsIHBjaCA9IDE2LCBjb2wgPSAicmVkIikKbGVnZW5kKCJ0b3ByaWdodCIsIGxlZ2VuZCA9IGMoIlRydWUgVmFsdWVzIiwgIkV4cGVjdGVkIFZhbHVlcyIpLCBjb2wgPSBjKCJibHVlIiwgInJlZCIpLCBsdHkgPSAxLCBjZXggPSAwLjgpCmBgYAoKCgpgYGB7cn0KIyBJbml0aWFsaXplIG1hdHJpY2VzIHRvIHN0b3JlIGF2ZXJhZ2VzIGZvciBlYWNoIHBvc2l0aW9uCmF2ZXJhZ2VfYmlkIDwtIG1hdHJpeChOQSwgbnJvdyA9IDEwMCwgbmNvbCA9IDEwKQphdmVyYWdlX2FzayA8LSBtYXRyaXgoTkEsIG5yb3cgPSAxMDAsIG5jb2wgPSAxMCkKCiMgTG9vcCB0aHJvdWdoIGVhY2ggc2ltdWxhdGlvbiAobikKZm9yIChuIGluIDE6MTApIHsKICAjIEV4dHJhY3QgVHJ1ZSB2YWx1ZXMgZnJvbSB0aGUgYWdncmVnYXRlZF9yZXN1bHRzXzQgZGF0YWZyYW1lCiAgQmlkc19zZXQ4IDwtIHN0cnNwbGl0KGdzdWIoIlxcW3xcXF0iLCAiIiwgdW5saXN0KGFnZ3JlZ2F0ZWRfcmVzdWx0c184W24sIDRdKSksICIsICIpCiAgCiAgIyBFeHRyYWN0IEV4cGVjdGVkIHZhbHVlcyBmcm9tIHRoZSBhZ2dyZWdhdGVkX3Jlc3VsdHNfNCBkYXRhZnJhbWUKICBBc2tzX3NldDggPC0gc3Ryc3BsaXQoZ3N1YigiXFxbfFxcXSIsICIiLCB1bmxpc3QoYWdncmVnYXRlZF9yZXN1bHRzXzhbbiwgNV0pKSwgIiwgIikKICAKICAjIExvb3AgdGhyb3VnaCBlYWNoIHBvc2l0aW9uIChpKQogIGZvciAoaSBpbiAxOjEwMCkgewogICAgIyBFeHRyYWN0IFRydWUgYW5kIEV4cGVjdGVkIHZhbHVlcyBmb3IgdGhlIGktdGggcG9zaXRpb24KICAgIEJpZHMgPC0gc2FwcGx5KEJpZHNfc2V0OCwgZnVuY3Rpb24oeCkgYXMubnVtZXJpYyh4W2ldKSkKICAgIEFza3MgPC0gc2FwcGx5KEFza3Nfc2V0OCwgZnVuY3Rpb24oeCkgYXMubnVtZXJpYyh4W2ldKSkKICAgIAogICAgIyBDYWxjdWxhdGUgdGhlIGF2ZXJhZ2Ugb2YgVHJ1ZSBhbmQgRXhwZWN0ZWQgdmFsdWVzIGZvciB0aGUgaS10aCBwb3NpdGlvbgogICAgYXZlcmFnZV9iaWRbaSwgbl0gPC0gbWVhbihCaWRzLCBuYS5ybSA9IFRSVUUpCiAgICBhdmVyYWdlX2Fza1tpLCBuXSA8LSBtZWFuKEFza3MsIG5hLnJtID0gVFJVRSkKICB9Cn0KCiMgQ2FsY3VsYXRlIHRoZSBvdmVyYWxsIGF2ZXJhZ2UgZm9yIGVhY2ggcG9zaXRpb24gYWNyb3NzIGFsbCBzaW11bGF0aW9ucwpvdmVyYWxsX2F2ZXJhZ2VfYmlkIDwtIHJvd01lYW5zKGF2ZXJhZ2VfYmlkLCBuYS5ybSA9IFRSVUUpCm92ZXJhbGxfYXZlcmFnZV9hc2sgPC0gcm93TWVhbnMoYXZlcmFnZV9hc2ssIG5hLnJtID0gVFJVRSkKCiMgUGxvdCB0aGUgb3ZlcmFsbCBhdmVyYWdlcwpwbG90KG92ZXJhbGxfYXZlcmFnZV9iaWQsIHR5cGUgPSAibCIsIHBjaCA9IDE2LCBjb2wgPSAiYmx1ZSIsIG1haW4gPSAiT3ZlcmFsbCBBdmVyYWdlIG9mIEJpZHMgdnMgQXNrcyIsIHhsYWIgPSAiUG9zaXRpb24gaW4gTGlzdCIsIHlsYWIgPSAiVmFsdWUiLCB5bGltID0gYyhtaW4oYyhvdmVyYWxsX2F2ZXJhZ2VfYmlkLCBvdmVyYWxsX2F2ZXJhZ2VfYXNrKSksIG1heChjKG92ZXJhbGxfYXZlcmFnZV9iaWQsIG92ZXJhbGxfYXZlcmFnZV9hc2spKSkpCmxpbmVzKG92ZXJhbGxfYXZlcmFnZV9hc2ssIHR5cGUgPSAibCIsIHBjaCA9IDE2LCBjb2wgPSAicmVkIikKbGVnZW5kKCJ0b3ByaWdodCIsIGxlZ2VuZCA9IGMoIkJpZHMiLCAiQXNrcyIpLCBjb2wgPSBjKCJibHVlIiwgInJlZCIpLCBsdHkgPSAxLCBjZXggPSAwLjgpCmBgYAoKYGBge3J9CiMgSW5pdGlhbGl6ZSBtYXRyaWNlcyB0byBzdG9yZSBhdmVyYWdlcyBmb3IgZWFjaCBwb3NpdGlvbgphdmVyYWdlX2JpZCA8LSBtYXRyaXgoTkEsIG5yb3cgPSAxMDAsIG5jb2wgPSAxMCkKYXZlcmFnZV9hc2sgPC0gbWF0cml4KE5BLCBucm93ID0gMTAwLCBuY29sID0gMTApCgojIExvb3AgdGhyb3VnaCBlYWNoIHNpbXVsYXRpb24gKG4pCmZvciAobiBpbiAxOjEwKSB7CiAgIyBFeHRyYWN0IFRydWUgdmFsdWVzIGZyb20gdGhlIGFnZ3JlZ2F0ZWRfcmVzdWx0c180IGRhdGFmcmFtZQogIEJpZHNfc2V0OCA8LSBzdHJzcGxpdChnc3ViKCJcXFt8XFxdIiwgIiIsIHVubGlzdChhZ2dyZWdhdGVkX3Jlc3VsdHNfOFtuLCA0XSkpLCAiLCAiKQogIAogICMgRXh0cmFjdCBFeHBlY3RlZCB2YWx1ZXMgZnJvbSB0aGUgYWdncmVnYXRlZF9yZXN1bHRzXzQgZGF0YWZyYW1lCiAgQXNrc19zZXQ4IDwtIHN0cnNwbGl0KGdzdWIoIlxcW3xcXF0iLCAiIiwgdW5saXN0KGFnZ3JlZ2F0ZWRfcmVzdWx0c184W24sIDVdKSksICIsICIpCiAgCiAgIyBMb29wIHRocm91Z2ggZWFjaCBwb3NpdGlvbiAoaSkKICBmb3IgKGkgaW4gMToxMDApIHsKICAgICMgRXh0cmFjdCBUcnVlIGFuZCBFeHBlY3RlZCB2YWx1ZXMgZm9yIHRoZSBpLXRoIHBvc2l0aW9uCiAgICBCaWRzIDwtIHNhcHBseShCaWRzX3NldDgsIGZ1bmN0aW9uKHgpIGFzLm51bWVyaWMoeFtpXSkpCiAgICBBc2tzIDwtIHNhcHBseShBc2tzX3NldDgsIGZ1bmN0aW9uKHgpIGFzLm51bWVyaWMoeFtpXSkpCiAgICAKICAgICMgQ2FsY3VsYXRlIHRoZSBhdmVyYWdlIG9mIFRydWUgYW5kIEV4cGVjdGVkIHZhbHVlcyBmb3IgdGhlIGktdGggcG9zaXRpb24KICAgIGF2ZXJhZ2VfYmlkW2ksIG5dIDwtIG1lYW4oQmlkcywgbmEucm0gPSBUUlVFKQogICAgYXZlcmFnZV9hc2tbaSwgbl0gPC0gbWVhbihBc2tzLCBuYS5ybSA9IFRSVUUpCiAgfQp9CgojIENhbGN1bGF0ZSB0aGUgb3ZlcmFsbCBhdmVyYWdlIGZvciBlYWNoIHBvc2l0aW9uIGFjcm9zcyBhbGwgc2ltdWxhdGlvbnMKb3ZlcmFsbF9hdmVyYWdlX2JpZCA8LSByb3dNZWFucyhhdmVyYWdlX2JpZCwgbmEucm0gPSBUUlVFKQpvdmVyYWxsX2F2ZXJhZ2VfYXNrIDwtIHJvd01lYW5zKGF2ZXJhZ2VfYXNrLCBuYS5ybSA9IFRSVUUpCgojIyBUcnVlIFZhbHVlCiMgSW5pdGlhbGl6ZSBtYXRyaWNlcyB0byBzdG9yZSBhdmVyYWdlcyBmb3IgZWFjaCBwb3NpdGlvbgphdmVyYWdlX3RydWUgPC0gbWF0cml4KE5BLCBucm93ID0gMTAwLCBuY29sID0gMTApCmF2ZXJhZ2VfZXhwZWN0ZWQgPC0gbWF0cml4KE5BLCBucm93ID0gMTAwLCBuY29sID0gMTApCgojIExvb3AgdGhyb3VnaCBlYWNoIHNpbXVsYXRpb24gKG4pCmZvciAobiBpbiAxOjEwKSB7CiAgIyBFeHRyYWN0IFRydWUgdmFsdWVzIGZyb20gdGhlIGFnZ3JlZ2F0ZWRfcmVzdWx0c180IGRhdGFmcmFtZQogIFRydWVWYWx1ZXNfc2V0OCA8LSBzdHJzcGxpdChnc3ViKCJcXFt8XFxdIiwgIiIsIHVubGlzdChhZ2dyZWdhdGVkX3Jlc3VsdHNfOFtuLCAyXSkpLCAiLCAiKQogIAogICMgRXh0cmFjdCBFeHBlY3RlZCB2YWx1ZXMgZnJvbSB0aGUgYWdncmVnYXRlZF9yZXN1bHRzXzQgZGF0YWZyYW1lCiAgRXhwZWN0ZWRWYWx1ZXNfc2V0OCA8LSBzdHJzcGxpdChnc3ViKCJcXFt8XFxdIiwgIiIsIHVubGlzdChhZ2dyZWdhdGVkX3Jlc3VsdHNfOFtuLCAzXSkpLCAiLCAiKQogIAogICMgTG9vcCB0aHJvdWdoIGVhY2ggcG9zaXRpb24gKGkpCiAgZm9yIChpIGluIDE6MTAwKSB7CiAgICAjIEV4dHJhY3QgVHJ1ZSBhbmQgRXhwZWN0ZWQgdmFsdWVzIGZvciB0aGUgaS10aCBwb3NpdGlvbgogICAgVHJ1ZV92YWx1ZXMgPC0gc2FwcGx5KFRydWVWYWx1ZXNfc2V0OCwgZnVuY3Rpb24oeCkgYXMubnVtZXJpYyh4W2ldKSkKICAgIEV4cGVjdGVkX3ZhbHVlcyA8LSBzYXBwbHkoRXhwZWN0ZWRWYWx1ZXNfc2V0OCwgZnVuY3Rpb24oeCkgYXMubnVtZXJpYyh4W2ldKSkKICAgIAogICAgIyBDYWxjdWxhdGUgdGhlIGF2ZXJhZ2Ugb2YgVHJ1ZSBhbmQgRXhwZWN0ZWQgdmFsdWVzIGZvciB0aGUgaS10aCBwb3NpdGlvbgogICAgYXZlcmFnZV90cnVlW2ksIG5dIDwtIG1lYW4oVHJ1ZV92YWx1ZXMsIG5hLnJtID0gVFJVRSkKICAgIGF2ZXJhZ2VfZXhwZWN0ZWRbaSwgbl0gPC0gbWVhbihFeHBlY3RlZF92YWx1ZXMsIG5hLnJtID0gVFJVRSkKICB9Cn0KCiMgQ2FsY3VsYXRlIHRoZSBvdmVyYWxsIGF2ZXJhZ2UgZm9yIGVhY2ggcG9zaXRpb24gYWNyb3NzIGFsbCBzaW11bGF0aW9ucwpvdmVyYWxsX2F2ZXJhZ2VfdHJ1ZSA8LSByb3dNZWFucyhhdmVyYWdlX3RydWUsIG5hLnJtID0gVFJVRSkKb3ZlcmFsbF9hdmVyYWdlX2V4cGVjdGVkIDwtIHJvd01lYW5zKGF2ZXJhZ2VfZXhwZWN0ZWQsIG5hLnJtID0gVFJVRSkKCiMgUGxvdCB0aGUgb3ZlcmFsbCBhdmVyYWdlcwojcGxvdChvdmVyYWxsX2F2ZXJhZ2VfdHJ1ZSwgdHlwZSA9ICJsIiwgcGNoID0gMTYsIGNvbCA9ICJibHVlIiwgbWFpbiA9ICJPdmVyYWxsIEF2ZXJhZ2Ugb2YgVHJ1ZSB2cyBFeHBlY3RlZCBWYWx1ZXMiLCB4bGFiID0gIlBvc2l0aW9uIGluIExpc3QiLCB5bGFiID0gIlZhbHVlIiwgeWxpbSA9IGMobWluKGMob3ZlcmFsbF9hdmVyYWdlX3RydWUsIG92ZXJhbGxfYXZlcmFnZV9leHBlY3RlZCkpLCBtYXgoYyhvdmVyYWxsX2F2ZXJhZ2VfdHJ1ZSwgb3ZlcmFsbF9hdmVyYWdlX2V4cGVjdGVkKSkpKQojbGluZXMob3ZlcmFsbF9hdmVyYWdlX2V4cGVjdGVkLCB0eXBlID0gImwiLCBwY2ggPSAxNiwgY29sID0gInJlZCIpCiNsZWdlbmQoInRvcHJpZ2h0IiwgbGVnZW5kID0gYygiVHJ1ZSBWYWx1ZXMiLCAiRXhwZWN0ZWQgVmFsdWVzIiksIGNvbCA9IGMoImJsdWUiLCAicmVkIiksIGx0eSA9IDEsIGNleCA9IDAuOCkKCiMgUGxvdCB0aGUgb3ZlcmFsbCBhdmVyYWdlcwpwbG90KG92ZXJhbGxfYXZlcmFnZV9iaWQsIHR5cGUgPSAibCIsIHBjaCA9IDE2LCBjb2wgPSAiYmx1ZSIsIG1haW4gPSAiT3ZlcmFsbCBBdmVyYWdlIG9mIEJpZHMgdnMgQXNrcyAmIFRydWUgdnMgRXhwZWN0ZWQgVmFsdWVzIiwgeGxhYiA9ICJQb3NpdGlvbiBpbiBMaXN0IiwgeWxhYiA9ICJWYWx1ZSIsIHlsaW0gPSBjKG1pbihjKG92ZXJhbGxfYXZlcmFnZV9iaWQsIG92ZXJhbGxfYXZlcmFnZV9hc2ssIG92ZXJhbGxfYXZlcmFnZV90cnVlLCBvdmVyYWxsX2F2ZXJhZ2VfZXhwZWN0ZWQpKSwgbWF4KGMob3ZlcmFsbF9hdmVyYWdlX2JpZCwgb3ZlcmFsbF9hdmVyYWdlX2Fzaywgb3ZlcmFsbF9hdmVyYWdlX3RydWUsIG92ZXJhbGxfYXZlcmFnZV9leHBlY3RlZCkpKSkKbGluZXMob3ZlcmFsbF9hdmVyYWdlX2FzaywgdHlwZSA9ICJsIiwgcGNoID0gMTYsIGNvbCA9ICJyZWQiKQpsaW5lcyhvdmVyYWxsX2F2ZXJhZ2VfdHJ1ZSwgdHlwZSA9ICJsIiwgcGNoID0gMTYsIGNvbCA9ICJncmVlbiIpCmxpbmVzKG92ZXJhbGxfYXZlcmFnZV9leHBlY3RlZCwgdHlwZSA9ICJsIiwgcGNoID0gMTYsIGNvbCA9ICJwdXJwbGUiKQpsZWdlbmQoImJvdHRvbWxlZnQiLCBsZWdlbmQgPSBjKCJCaWRzIiwgIkFza3MiLCAiVHJ1ZSBWYWx1ZSIsICJFeHBlY3RlZCBWYWx1ZSIpLCBjb2wgPSBjKCJibHVlIiwgInJlZCIsICJncmVlbiIsICJwdXJwbGUiKSwgbHR5ID0gMSwgY2V4ID0gMC44KQpgYGAKCgoKYGBge3J9CiMgSW5pdGlhbGl6ZSBtYXRyaWNlcyB0byBzdG9yZSBhdmVyYWdlcyBmb3IgZWFjaCBwb3NpdGlvbgphdmVyYWdlX01NX3BubCA8LSBtYXRyaXgoTkEsIG5yb3cgPSAxMDAsIG5jb2wgPSAxMCkKYXZlcmFnZV9JbmZvcm1lZF9wbmwgPC0gbWF0cml4KE5BLCBucm93ID0gMTAwLCBuY29sID0gMTApCmF2ZXJhZ2VfTm9pc3lJbmZvcm1lZDFfcG5sIDwtIG1hdHJpeChOQSwgbnJvdyA9IDEwMCwgbmNvbCA9IDEwKQphdmVyYWdlX05vaXN5SW5mb3JtZWQyX3BubCA8LSBtYXRyaXgoTkEsIG5yb3cgPSAxMDAsIG5jb2wgPSAxMCkKYXZlcmFnZV9Ob2lzeTFfcG5sIDwtIG1hdHJpeChOQSwgbnJvdyA9IDEwMCwgbmNvbCA9IDEwKQphdmVyYWdlX05vaXN5Ml9wbmwgPC0gbWF0cml4KE5BLCBucm93ID0gMTAwLCBuY29sID0gMTApCmF2ZXJhZ2VfTm9pc3kzX3BubCA8LSBtYXRyaXgoTkEsIG5yb3cgPSAxMDAsIG5jb2wgPSAxMCkKCiMgTG9vcCB0aHJvdWdoIGVhY2ggc2ltdWxhdGlvbiAobikKZm9yIChuIGluIDE6MTApIHsKCiAgTU1fcG5sX3NldDggPC0gc3Ryc3BsaXQoZ3N1YigiXFxbfFxcXSIsICIiLCB1bmxpc3QoYWdncmVnYXRlZF9yZXN1bHRzXzhbbiwgNl0pKSwgIiwgIikKCiAgSW5mb3JtZWRfcG5sX3NldDggPC0gc3Ryc3BsaXQoZ3N1YigiXFxbfFxcXSIsICIiLCB1bmxpc3QoYWdncmVnYXRlZF9yZXN1bHRzXzhbbiwgOF0pKSwgIiwgIikKICAKICBOb2lzeUluZm9ybWVkMV9wbmxfc2V0OCA8LSBzdHJzcGxpdChnc3ViKCJcXFt8XFxdIiwgIiIsIHVubGlzdChhZ2dyZWdhdGVkX3Jlc3VsdHNfOFtuLCAxMF0pKSwgIiwgIikKICAKICBOb2lzeUluZm9ybWVkMl9wbmxfc2V0OCA8LSBzdHJzcGxpdChnc3ViKCJcXFt8XFxdIiwgIiIsIHVubGlzdChhZ2dyZWdhdGVkX3Jlc3VsdHNfOFtuLCAxMl0pKSwgIiwgIikKICAKICBOb2lzeTFfcG5sX3NldDggPC0gc3Ryc3BsaXQoZ3N1YigiXFxbfFxcXSIsICIiLCB1bmxpc3QoYWdncmVnYXRlZF9yZXN1bHRzXzhbbiwgMTRdKSksICIsICIpCiAgCiAgTm9pc3kyX3BubF9zZXQ4IDwtIHN0cnNwbGl0KGdzdWIoIlxcW3xcXF0iLCAiIiwgdW5saXN0KGFnZ3JlZ2F0ZWRfcmVzdWx0c184W24sIDE2XSkpLCAiLCAiKQogIAogIE5vaXN5M19wbmxfc2V0OCA8LSBzdHJzcGxpdChnc3ViKCJcXFt8XFxdIiwgIiIsIHVubGlzdChhZ2dyZWdhdGVkX3Jlc3VsdHNfOFtuLCAxOF0pKSwgIiwgIikKICAKICAjIExvb3AgdGhyb3VnaCBlYWNoIHBvc2l0aW9uIChpKQogIGZvciAoaSBpbiAxOjEwMCkgewogICAgIyBFeHRyYWN0IFRydWUgYW5kIEV4cGVjdGVkIHZhbHVlcyBmb3IgdGhlIGktdGggcG9zaXRpb24KICAgIE1NX3BubCA8LSBzYXBwbHkoTU1fcG5sX3NldDgsIGZ1bmN0aW9uKHgpIGFzLm51bWVyaWMoeFtpXSkpCiAgICBJbmZvcm1lZF9wbmwgPC0gc2FwcGx5KEluZm9ybWVkX3BubF9zZXQ4LCBmdW5jdGlvbih4KSBhcy5udW1lcmljKHhbaV0pKQogICAgTm9pc3lJbmZvcm1lZDFfcG5sIDwtIHNhcHBseShOb2lzeUluZm9ybWVkMV9wbmxfc2V0OCwgZnVuY3Rpb24oeCkgYXMubnVtZXJpYyh4W2ldKSkKICAgIE5vaXN5SW5mb3JtZWQyX3BubCA8LSBzYXBwbHkoTm9pc3lJbmZvcm1lZDJfcG5sX3NldDgsIGZ1bmN0aW9uKHgpIGFzLm51bWVyaWMoeFtpXSkpCiAgICBOb2lzeTFfcG5sIDwtIHNhcHBseShOb2lzeTFfcG5sX3NldDgsIGZ1bmN0aW9uKHgpIGFzLm51bWVyaWMoeFtpXSkpCiAgICBOb2lzeTJfcG5sIDwtIHNhcHBseShOb2lzeTJfcG5sX3NldDgsIGZ1bmN0aW9uKHgpIGFzLm51bWVyaWMoeFtpXSkpCiAgICBOb2lzeTNfcG5sIDwtIHNhcHBseShOb2lzeTNfcG5sX3NldDgsIGZ1bmN0aW9uKHgpIGFzLm51bWVyaWMoeFtpXSkpCiAgICAKICAgICMgQ2FsY3VsYXRlIHRoZSBhdmVyYWdlIG9mIFRydWUgYW5kIEV4cGVjdGVkIHZhbHVlcyBmb3IgdGhlIGktdGggcG9zaXRpb24KICAgIGF2ZXJhZ2VfTU1fcG5sW2ksIG5dIDwtIG1lYW4oTU1fcG5sLCBuYS5ybSA9IFRSVUUpCiAgICBhdmVyYWdlX0luZm9ybWVkX3BubFtpLCBuXSA8LSBtZWFuKEluZm9ybWVkX3BubCwgbmEucm0gPSBUUlVFKQogICAgYXZlcmFnZV9Ob2lzeUluZm9ybWVkMV9wbmxbaSwgbl0gPC0gbWVhbihOb2lzeUluZm9ybWVkMV9wbmwsIG5hLnJtID0gVFJVRSkKICAgIGF2ZXJhZ2VfTm9pc3lJbmZvcm1lZDJfcG5sW2ksIG5dIDwtIG1lYW4oTm9pc3lJbmZvcm1lZDJfcG5sLCBuYS5ybSA9IFRSVUUpCiAgICBhdmVyYWdlX05vaXN5MV9wbmxbaSwgbl0gPC0gbWVhbihOb2lzeTFfcG5sLCBuYS5ybSA9IFRSVUUpCiAgICBhdmVyYWdlX05vaXN5Ml9wbmxbaSwgbl0gPC0gbWVhbihOb2lzeTJfcG5sLCBuYS5ybSA9IFRSVUUpCiAgICBhdmVyYWdlX05vaXN5M19wbmxbaSwgbl0gPC0gbWVhbihOb2lzeTNfcG5sLCBuYS5ybSA9IFRSVUUpCiAgfQp9CgojIENhbGN1bGF0ZSB0aGUgb3ZlcmFsbCBhdmVyYWdlIGZvciBlYWNoIHBvc2l0aW9uIGFjcm9zcyBhbGwgc2ltdWxhdGlvbnMKb3ZlcmFsbF9hdmVyYWdlX01NX3BubCA8LSByb3dNZWFucyhhdmVyYWdlX01NX3BubCwgbmEucm0gPSBUUlVFKQpvdmVyYWxsX2F2ZXJhZ2VfSW5mb3JtZWRfcG5sIDwtIHJvd01lYW5zKGF2ZXJhZ2VfSW5mb3JtZWRfcG5sLCBuYS5ybSA9IFRSVUUpCm92ZXJhbGxfYXZlcmFnZV9Ob2lzeUluZm9ybWVkMV9wbmwgPC0gcm93TWVhbnMoYXZlcmFnZV9Ob2lzeUluZm9ybWVkMV9wbmwsIG5hLnJtID0gVFJVRSkKb3ZlcmFsbF9hdmVyYWdlX05vaXN5SW5mb3JtZWQyX3BubCA8LSByb3dNZWFucyhhdmVyYWdlX05vaXN5SW5mb3JtZWQyX3BubCwgbmEucm0gPSBUUlVFKQpvdmVyYWxsX2F2ZXJhZ2VfTm9pc3kxX3BubCA8LSByb3dNZWFucyhhdmVyYWdlX05vaXN5MV9wbmwsIG5hLnJtID0gVFJVRSkKb3ZlcmFsbF9hdmVyYWdlX05vaXN5Ml9wbmwgPC0gcm93TWVhbnMoYXZlcmFnZV9Ob2lzeTJfcG5sLCBuYS5ybSA9IFRSVUUpCm92ZXJhbGxfYXZlcmFnZV9Ob2lzeTNfcG5sIDwtIHJvd01lYW5zKGF2ZXJhZ2VfTm9pc3kzX3BubCwgbmEucm0gPSBUUlVFKQoKIyBQbG90IHRoZSBvdmVyYWxsIGF2ZXJhZ2VzCnBsb3Qob3ZlcmFsbF9hdmVyYWdlX01NX3BubCwgdHlwZSA9ICJsIiwgcGNoID0gMTYsIGNvbCA9ICJibGFjayIsIG1haW4gPSAiT3ZlcmFsbCBBdmVyYWdlIFBOTCIsIHhsYWIgPSAiUG9zaXRpb24gaW4gTGlzdCIsIHlsYWIgPSAiVmFsdWUiLCB5bGltID0gYyhtaW4oYyhvdmVyYWxsX2F2ZXJhZ2VfTU1fcG5sLCBvdmVyYWxsX2F2ZXJhZ2VfSW5mb3JtZWRfcG5sLCBvdmVyYWxsX2F2ZXJhZ2VfTm9pc3lJbmZvcm1lZDFfcG5sLCBvdmVyYWxsX2F2ZXJhZ2VfTm9pc3lJbmZvcm1lZDJfcG5sLCBvdmVyYWxsX2F2ZXJhZ2VfTm9pc3kxX3BubCwgb3ZlcmFsbF9hdmVyYWdlX05vaXN5Ml9wbmwsIG92ZXJhbGxfYXZlcmFnZV9Ob2lzeTNfcG5sKSksIG1heChjKG92ZXJhbGxfYXZlcmFnZV9NTV9wbmwsIG92ZXJhbGxfYXZlcmFnZV9JbmZvcm1lZF9wbmwsIG92ZXJhbGxfYXZlcmFnZV9Ob2lzeUluZm9ybWVkMV9wbmwsIG92ZXJhbGxfYXZlcmFnZV9Ob2lzeUluZm9ybWVkMl9wbmwsIG92ZXJhbGxfYXZlcmFnZV9Ob2lzeTFfcG5sLCBvdmVyYWxsX2F2ZXJhZ2VfTm9pc3kyX3BubCwgb3ZlcmFsbF9hdmVyYWdlX05vaXN5M19wbmwpKSkpCmxpbmVzKG92ZXJhbGxfYXZlcmFnZV9JbmZvcm1lZF9wbmwsIHR5cGUgPSAibCIsIHBjaCA9IDE2LCBjb2wgPSAicmVkIikKbGluZXMob3ZlcmFsbF9hdmVyYWdlX05vaXN5SW5mb3JtZWQxX3BubCwgdHlwZSA9ICJsIiwgcGNoID0gMTYsIGNvbCA9ICJncmVlbiIpCmxpbmVzKG92ZXJhbGxfYXZlcmFnZV9Ob2lzeUluZm9ybWVkMl9wbmwsIHR5cGUgPSAibCIsIHBjaCA9IDE2LCBjb2wgPSAieWVsbG93IikKbGluZXMob3ZlcmFsbF9hdmVyYWdlX05vaXN5MV9wbmwsIHR5cGUgPSAibCIsIHBjaCA9IDE2LCBjb2wgPSAiYmx1ZSIpCmxpbmVzKG92ZXJhbGxfYXZlcmFnZV9Ob2lzeTJfcG5sLCB0eXBlID0gImwiLCBwY2ggPSAxNiwgY29sID0gInB1cnBsZSIpCmxpbmVzKG92ZXJhbGxfYXZlcmFnZV9Ob2lzeTNfcG5sLCB0eXBlID0gImwiLCBwY2ggPSAxNiwgY29sID0gIm9yYW5nZSIpCgojIEFkZCBsZWdlbmQKbGVnZW5kKCJib3R0b21sZWZ0IiwgbGVnZW5kID0gYygiTWFya2V0IE1ha2VyIiwgIkluZm9ybWVkIiwgIk5vaXN5IEluZm9ybWVkIDEiLCAiTm9pc3kgSW5mb3JtZWQgMiIsICJOb2lzeSAzIiwgIk5vaXN5IDQiLCAiTm9pc3kgNSIpLCBjb2wgPSBjKCJibGFjayIsICJyZWQiLCAiZ3JlZW4iLCAieWVsbG93IiwgImJsdWUiLCAicHVycGxlIiwgIm9yYW5nZSIpLCBsdHkgPSAxLCBjZXggPSAwLjgpCmBgYAoKYGBge3J9CiMgSW5pdGlhbGl6ZSBtYXRyaWNlcyB0byBzdG9yZSBhdmVyYWdlcyBmb3IgZWFjaCBwb3NpdGlvbgphdmVyYWdlX01NX3BubCA8LSBtYXRyaXgoTkEsIG5yb3cgPSAxMDAsIG5jb2wgPSAxMCkKYXZlcmFnZV9JbmZvcm1lZF9wbmwgPC0gbWF0cml4KE5BLCBucm93ID0gMTAwLCBuY29sID0gMTApCmF2ZXJhZ2VfTm9pc3lJbmZvcm1lZDFfcG5sIDwtIG1hdHJpeChOQSwgbnJvdyA9IDEwMCwgbmNvbCA9IDEwKQphdmVyYWdlX05vaXN5SW5mb3JtZWQyX3BubCA8LSBtYXRyaXgoTkEsIG5yb3cgPSAxMDAsIG5jb2wgPSAxMCkKYXZlcmFnZV9Ob2lzeTFfcG5sIDwtIG1hdHJpeChOQSwgbnJvdyA9IDEwMCwgbmNvbCA9IDEwKQphdmVyYWdlX05vaXN5Ml9wbmwgPC0gbWF0cml4KE5BLCBucm93ID0gMTAwLCBuY29sID0gMTApCmF2ZXJhZ2VfTm9pc3kzX3BubCA8LSBtYXRyaXgoTkEsIG5yb3cgPSAxMDAsIG5jb2wgPSAxMCkKCiMgTG9vcCB0aHJvdWdoIGVhY2ggc2ltdWxhdGlvbiAobikKZm9yIChuIGluIDE6MTApIHsKCiAgTU1fcG9zX3NldDggPC0gc3Ryc3BsaXQoZ3N1YigiXFxbfFxcXSIsICIiLCB1bmxpc3QoYWdncmVnYXRlZF9yZXN1bHRzXzhbbiwgN10pKSwgIiwgIikKCiAgSW5mb3JtZWRfcG9zX3NldDggPC0gc3Ryc3BsaXQoZ3N1YigiXFxbfFxcXSIsICIiLCB1bmxpc3QoYWdncmVnYXRlZF9yZXN1bHRzXzhbbiwgOV0pKSwgIiwgIikKICAKICBOb2lzeUluZm9ybWVkMV9wb3Nfc2V0OCA8LSBzdHJzcGxpdChnc3ViKCJcXFt8XFxdIiwgIiIsIHVubGlzdChhZ2dyZWdhdGVkX3Jlc3VsdHNfOFtuLCAxMV0pKSwgIiwgIikKICAKICBOb2lzeUluZm9ybWVkMl9wb3Nfc2V0OCA8LSBzdHJzcGxpdChnc3ViKCJcXFt8XFxdIiwgIiIsIHVubGlzdChhZ2dyZWdhdGVkX3Jlc3VsdHNfOFtuLCAxM10pKSwgIiwgIikKICAKICBOb2lzeTFfcG9zX3NldDggPC0gc3Ryc3BsaXQoZ3N1YigiXFxbfFxcXSIsICIiLCB1bmxpc3QoYWdncmVnYXRlZF9yZXN1bHRzXzhbbiwgMTVdKSksICIsICIpCiAgCiAgTm9pc3kyX3Bvc19zZXQ4IDwtIHN0cnNwbGl0KGdzdWIoIlxcW3xcXF0iLCAiIiwgdW5saXN0KGFnZ3JlZ2F0ZWRfcmVzdWx0c184W24sIDE3XSkpLCAiLCAiKQogIAogIE5vaXN5M19wb3Nfc2V0OCA8LSBzdHJzcGxpdChnc3ViKCJcXFt8XFxdIiwgIiIsIHVubGlzdChhZ2dyZWdhdGVkX3Jlc3VsdHNfOFtuLCAxOV0pKSwgIiwgIikKICAKICAjIExvb3AgdGhyb3VnaCBlYWNoIHBvc2l0aW9uIChpKQogIGZvciAoaSBpbiAxOjEwMCkgewogICAgIyBFeHRyYWN0IFRydWUgYW5kIEV4cGVjdGVkIHZhbHVlcyBmb3IgdGhlIGktdGggcG9zaXRpb24KICAgIE1NX3BvcyA8LSBzYXBwbHkoTU1fcG9zX3NldDgsIGZ1bmN0aW9uKHgpIGFzLm51bWVyaWMoeFtpXSkpCiAgICBJbmZvcm1lZF9wb3MgPC0gc2FwcGx5KEluZm9ybWVkX3Bvc19zZXQ4LCBmdW5jdGlvbih4KSBhcy5udW1lcmljKHhbaV0pKQogICAgTm9pc3lJbmZvcm1lZDFfcG9zIDwtIHNhcHBseShOb2lzeUluZm9ybWVkMV9wb3Nfc2V0OCwgZnVuY3Rpb24oeCkgYXMubnVtZXJpYyh4W2ldKSkKICAgIE5vaXN5SW5mb3JtZWQyX3BvcyA8LSBzYXBwbHkoTm9pc3lJbmZvcm1lZDJfcG9zX3NldDgsIGZ1bmN0aW9uKHgpIGFzLm51bWVyaWMoeFtpXSkpCiAgICBOb2lzeTFfcG9zIDwtIHNhcHBseShOb2lzeTFfcG9zX3NldDgsIGZ1bmN0aW9uKHgpIGFzLm51bWVyaWMoeFtpXSkpCiAgICBOb2lzeTJfcG9zIDwtIHNhcHBseShOb2lzeTJfcG9zX3NldDgsIGZ1bmN0aW9uKHgpIGFzLm51bWVyaWMoeFtpXSkpCiAgICBOb2lzeTNfcG9zIDwtIHNhcHBseShOb2lzeTNfcG9zX3NldDgsIGZ1bmN0aW9uKHgpIGFzLm51bWVyaWMoeFtpXSkpCiAgICAKICAgICMgQ2FsY3VsYXRlIHRoZSBhdmVyYWdlIG9mIFRydWUgYW5kIEV4cGVjdGVkIHZhbHVlcyBmb3IgdGhlIGktdGggcG9zaXRpb24KICAgIGF2ZXJhZ2VfTU1fcG9zW2ksIG5dIDwtIG1lYW4oTU1fcG9zLCBuYS5ybSA9IFRSVUUpCiAgICBhdmVyYWdlX0luZm9ybWVkX3Bvc1tpLCBuXSA8LSBtZWFuKEluZm9ybWVkX3BvcywgbmEucm0gPSBUUlVFKQogICAgYXZlcmFnZV9Ob2lzeUluZm9ybWVkMV9wb3NbaSwgbl0gPC0gbWVhbihOb2lzeUluZm9ybWVkMV9wb3MsIG5hLnJtID0gVFJVRSkKICAgIGF2ZXJhZ2VfTm9pc3lJbmZvcm1lZDJfcG9zW2ksIG5dIDwtIG1lYW4oTm9pc3lJbmZvcm1lZDJfcG9zLCBuYS5ybSA9IFRSVUUpCiAgICBhdmVyYWdlX05vaXN5MV9wb3NbaSwgbl0gPC0gbWVhbihOb2lzeTFfcG9zLCBuYS5ybSA9IFRSVUUpCiAgICBhdmVyYWdlX05vaXN5Ml9wb3NbaSwgbl0gPC0gbWVhbihOb2lzeTJfcG9zLCBuYS5ybSA9IFRSVUUpCiAgICBhdmVyYWdlX05vaXN5M19wb3NbaSwgbl0gPC0gbWVhbihOb2lzeTNfcG9zLCBuYS5ybSA9IFRSVUUpCiAgfQp9CgojIENhbGN1bGF0ZSB0aGUgb3ZlcmFsbCBhdmVyYWdlIGZvciBlYWNoIHBvc2l0aW9uIGFjcm9zcyBhbGwgc2ltdWxhdGlvbnMKb3ZlcmFsbF9hdmVyYWdlX01NX3BvcyA8LSByb3dNZWFucyhhdmVyYWdlX01NX3BvcywgbmEucm0gPSBUUlVFKQpvdmVyYWxsX2F2ZXJhZ2VfSW5mb3JtZWRfcG9zIDwtIHJvd01lYW5zKGF2ZXJhZ2VfSW5mb3JtZWRfcG9zLCBuYS5ybSA9IFRSVUUpCm92ZXJhbGxfYXZlcmFnZV9Ob2lzeUluZm9ybWVkMV9wb3MgPC0gcm93TWVhbnMoYXZlcmFnZV9Ob2lzeUluZm9ybWVkMV9wb3MsIG5hLnJtID0gVFJVRSkKb3ZlcmFsbF9hdmVyYWdlX05vaXN5SW5mb3JtZWQyX3BvcyA8LSByb3dNZWFucyhhdmVyYWdlX05vaXN5SW5mb3JtZWQyX3BvcywgbmEucm0gPSBUUlVFKQpvdmVyYWxsX2F2ZXJhZ2VfTm9pc3kxX3BvcyA8LSByb3dNZWFucyhhdmVyYWdlX05vaXN5MV9wb3MsIG5hLnJtID0gVFJVRSkKb3ZlcmFsbF9hdmVyYWdlX05vaXN5Ml9wb3MgPC0gcm93TWVhbnMoYXZlcmFnZV9Ob2lzeTJfcG9zLCBuYS5ybSA9IFRSVUUpCm92ZXJhbGxfYXZlcmFnZV9Ob2lzeTNfcG9zIDwtIHJvd01lYW5zKGF2ZXJhZ2VfTm9pc3kzX3BvcywgbmEucm0gPSBUUlVFKQoKIyBQbG90IHRoZSBvdmVyYWxsIGF2ZXJhZ2VzCnBsb3Qob3ZlcmFsbF9hdmVyYWdlX01NX3BvcywgdHlwZSA9ICJsIiwgcGNoID0gMTYsIGNvbCA9ICJibGFjayIsIG1haW4gPSAiT3ZlcmFsbCBBdmVyYWdlIFBvc2l0aW9uIiwgeGxhYiA9ICJQb3NpdGlvbiBpbiBMaXN0IiwgeWxhYiA9ICJWYWx1ZSIsIHlsaW0gPSBjKG1pbihjKG92ZXJhbGxfYXZlcmFnZV9NTV9wb3MsIG92ZXJhbGxfYXZlcmFnZV9JbmZvcm1lZF9wb3MsIG92ZXJhbGxfYXZlcmFnZV9Ob2lzeUluZm9ybWVkMV9wb3MsIG92ZXJhbGxfYXZlcmFnZV9Ob2lzeUluZm9ybWVkMl9wb3MsIG92ZXJhbGxfYXZlcmFnZV9Ob2lzeTFfcG9zLCBvdmVyYWxsX2F2ZXJhZ2VfTm9pc3kyX3Bvcywgb3ZlcmFsbF9hdmVyYWdlX05vaXN5M19wb3MpKSwgbWF4KGMob3ZlcmFsbF9hdmVyYWdlX01NX3Bvcywgb3ZlcmFsbF9hdmVyYWdlX0luZm9ybWVkX3Bvcywgb3ZlcmFsbF9hdmVyYWdlX05vaXN5SW5mb3JtZWQxX3Bvcywgb3ZlcmFsbF9hdmVyYWdlX05vaXN5SW5mb3JtZWQyX3Bvcywgb3ZlcmFsbF9hdmVyYWdlX05vaXN5MV9wb3MsIG92ZXJhbGxfYXZlcmFnZV9Ob2lzeTJfcG9zLCBvdmVyYWxsX2F2ZXJhZ2VfTm9pc3kzX3BvcykpKSkKbGluZXMob3ZlcmFsbF9hdmVyYWdlX0luZm9ybWVkX3BvcywgdHlwZSA9ICJsIiwgcGNoID0gMTYsIGNvbCA9ICJyZWQiKQpsaW5lcyhvdmVyYWxsX2F2ZXJhZ2VfTm9pc3lJbmZvcm1lZDFfcG9zLCB0eXBlID0gImwiLCBwY2ggPSAxNiwgY29sID0gImdyZWVuIikKbGluZXMob3ZlcmFsbF9hdmVyYWdlX05vaXN5SW5mb3JtZWQyX3BvcywgdHlwZSA9ICJsIiwgcGNoID0gMTYsIGNvbCA9ICJ5ZWxsb3ciKQpsaW5lcyhvdmVyYWxsX2F2ZXJhZ2VfTm9pc3kxX3BvcywgdHlwZSA9ICJsIiwgcGNoID0gMTYsIGNvbCA9ICJibHVlIikKbGluZXMob3ZlcmFsbF9hdmVyYWdlX05vaXN5Ml9wb3MsIHR5cGUgPSAibCIsIHBjaCA9IDE2LCBjb2wgPSAicHVycGxlIikKbGluZXMob3ZlcmFsbF9hdmVyYWdlX05vaXN5M19wb3MsIHR5cGUgPSAibCIsIHBjaCA9IDE2LCBjb2wgPSAib3JhbmdlIikKCiMgQWRkIGxlZ2VuZApsZWdlbmQoInRvcGxlZnQiLCBsZWdlbmQgPSBjKCJNYXJrZXQgTWFrZXIiLCAiSW5mb3JtZWQiLCAiTm9pc3kgSW5mb3JtZWQgMSIsICJOb2lzeSBJbmZvcm1lZCAyIiwgIk5vaXN5IDMiLCAiTm9pc3kgNCIsICJOb2lzeSA1IiksIGNvbCA9IGMoImJsYWNrIiwgInJlZCIsICJncmVlbiIsICJ5ZWxsb3ciLCAiYmx1ZSIsICJwdXJwbGUiLCAib3JhbmdlIiksIGx0eSA9IDEsIGNleCA9IDAuOCkKYGBgCgoKIyMgc2V0OSAoTWVhbiBSZXZlcnNpb246IDYpCgoKYGBge3J9CiMgSW5pdGlhbGl6ZSBtYXRyaWNlcyB0byBzdG9yZSBhdmVyYWdlcyBmb3IgZWFjaCBwb3NpdGlvbgphdmVyYWdlX3RydWUgPC0gbWF0cml4KE5BLCBucm93ID0gMTAwLCBuY29sID0gMTApCmF2ZXJhZ2VfZXhwZWN0ZWQgPC0gbWF0cml4KE5BLCBucm93ID0gMTAwLCBuY29sID0gMTApCgojIExvb3AgdGhyb3VnaCBlYWNoIHNpbXVsYXRpb24gKG4pCmZvciAobiBpbiAxOjEwKSB7CiAgIyBFeHRyYWN0IFRydWUgdmFsdWVzIGZyb20gdGhlIGFnZ3JlZ2F0ZWRfcmVzdWx0c180IGRhdGFmcmFtZQogIFRydWVWYWx1ZXNfc2V0OSA8LSBzdHJzcGxpdChnc3ViKCJcXFt8XFxdIiwgIiIsIHVubGlzdChhZ2dyZWdhdGVkX3Jlc3VsdHNfOVtuLCAyXSkpLCAiLCAiKQogIAogICMgRXh0cmFjdCBFeHBlY3RlZCB2YWx1ZXMgZnJvbSB0aGUgYWdncmVnYXRlZF9yZXN1bHRzXzQgZGF0YWZyYW1lCiAgRXhwZWN0ZWRWYWx1ZXNfc2V0OSA8LSBzdHJzcGxpdChnc3ViKCJcXFt8XFxdIiwgIiIsIHVubGlzdChhZ2dyZWdhdGVkX3Jlc3VsdHNfOVtuLCAzXSkpLCAiLCAiKQogIAogICMgTG9vcCB0aHJvdWdoIGVhY2ggcG9zaXRpb24gKGkpCiAgZm9yIChpIGluIDE6MTAwKSB7CiAgICAjIEV4dHJhY3QgVHJ1ZSBhbmQgRXhwZWN0ZWQgdmFsdWVzIGZvciB0aGUgaS10aCBwb3NpdGlvbgogICAgVHJ1ZV92YWx1ZXMgPC0gc2FwcGx5KFRydWVWYWx1ZXNfc2V0OSwgZnVuY3Rpb24oeCkgYXMubnVtZXJpYyh4W2ldKSkKICAgIEV4cGVjdGVkX3ZhbHVlcyA8LSBzYXBwbHkoRXhwZWN0ZWRWYWx1ZXNfc2V0OSwgZnVuY3Rpb24oeCkgYXMubnVtZXJpYyh4W2ldKSkKICAgIAogICAgIyBDYWxjdWxhdGUgdGhlIGF2ZXJhZ2Ugb2YgVHJ1ZSBhbmQgRXhwZWN0ZWQgdmFsdWVzIGZvciB0aGUgaS10aCBwb3NpdGlvbgogICAgYXZlcmFnZV90cnVlW2ksIG5dIDwtIG1lYW4oVHJ1ZV92YWx1ZXMsIG5hLnJtID0gVFJVRSkKICAgIGF2ZXJhZ2VfZXhwZWN0ZWRbaSwgbl0gPC0gbWVhbihFeHBlY3RlZF92YWx1ZXMsIG5hLnJtID0gVFJVRSkKICB9Cn0KCiMgQ2FsY3VsYXRlIHRoZSBvdmVyYWxsIGF2ZXJhZ2UgZm9yIGVhY2ggcG9zaXRpb24gYWNyb3NzIGFsbCBzaW11bGF0aW9ucwpvdmVyYWxsX2F2ZXJhZ2VfdHJ1ZSA8LSByb3dNZWFucyhhdmVyYWdlX3RydWUsIG5hLnJtID0gVFJVRSkKb3ZlcmFsbF9hdmVyYWdlX2V4cGVjdGVkIDwtIHJvd01lYW5zKGF2ZXJhZ2VfZXhwZWN0ZWQsIG5hLnJtID0gVFJVRSkKCiMgUGxvdCB0aGUgb3ZlcmFsbCBhdmVyYWdlcwpwbG90KG92ZXJhbGxfYXZlcmFnZV90cnVlLCB0eXBlID0gImwiLCBwY2ggPSAxNiwgY29sID0gImJsdWUiLCBtYWluID0gIk92ZXJhbGwgQXZlcmFnZSBvZiBUcnVlIHZzIEV4cGVjdGVkIFZhbHVlcyIsIHhsYWIgPSAiUG9zaXRpb24gaW4gTGlzdCIsIHlsYWIgPSAiVmFsdWUiLCB5bGltID0gYyhtaW4oYyhvdmVyYWxsX2F2ZXJhZ2VfdHJ1ZSwgb3ZlcmFsbF9hdmVyYWdlX2V4cGVjdGVkKSksIG1heChjKG92ZXJhbGxfYXZlcmFnZV90cnVlLCBvdmVyYWxsX2F2ZXJhZ2VfZXhwZWN0ZWQpKSkpCmxpbmVzKG92ZXJhbGxfYXZlcmFnZV9leHBlY3RlZCwgdHlwZSA9ICJsIiwgcGNoID0gMTYsIGNvbCA9ICJyZWQiKQpsZWdlbmQoInRvcHJpZ2h0IiwgbGVnZW5kID0gYygiVHJ1ZSBWYWx1ZXMiLCAiRXhwZWN0ZWQgVmFsdWVzIiksIGNvbCA9IGMoImJsdWUiLCAicmVkIiksIGx0eSA9IDEsIGNleCA9IDAuOCkKYGBgCgpgYGB7cn0KIyBJbml0aWFsaXplIG1hdHJpY2VzIHRvIHN0b3JlIGF2ZXJhZ2VzIGZvciBlYWNoIHBvc2l0aW9uCmF2ZXJhZ2VfYmlkIDwtIG1hdHJpeChOQSwgbnJvdyA9IDEwMCwgbmNvbCA9IDEwKQphdmVyYWdlX2FzayA8LSBtYXRyaXgoTkEsIG5yb3cgPSAxMDAsIG5jb2wgPSAxMCkKCiMgTG9vcCB0aHJvdWdoIGVhY2ggc2ltdWxhdGlvbiAobikKZm9yIChuIGluIDE6MTApIHsKICAjIEV4dHJhY3QgVHJ1ZSB2YWx1ZXMgZnJvbSB0aGUgYWdncmVnYXRlZF9yZXN1bHRzXzQgZGF0YWZyYW1lCiAgQmlkc19zZXQ5IDwtIHN0cnNwbGl0KGdzdWIoIlxcW3xcXF0iLCAiIiwgdW5saXN0KGFnZ3JlZ2F0ZWRfcmVzdWx0c185W24sIDRdKSksICIsICIpCiAgCiAgIyBFeHRyYWN0IEV4cGVjdGVkIHZhbHVlcyBmcm9tIHRoZSBhZ2dyZWdhdGVkX3Jlc3VsdHNfNCBkYXRhZnJhbWUKICBBc2tzX3NldDkgPC0gc3Ryc3BsaXQoZ3N1YigiXFxbfFxcXSIsICIiLCB1bmxpc3QoYWdncmVnYXRlZF9yZXN1bHRzXzlbbiwgNV0pKSwgIiwgIikKICAKICAjIExvb3AgdGhyb3VnaCBlYWNoIHBvc2l0aW9uIChpKQogIGZvciAoaSBpbiAxOjEwMCkgewogICAgIyBFeHRyYWN0IFRydWUgYW5kIEV4cGVjdGVkIHZhbHVlcyBmb3IgdGhlIGktdGggcG9zaXRpb24KICAgIEJpZHMgPC0gc2FwcGx5KEJpZHNfc2V0OSwgZnVuY3Rpb24oeCkgYXMubnVtZXJpYyh4W2ldKSkKICAgIEFza3MgPC0gc2FwcGx5KEFza3Nfc2V0OSwgZnVuY3Rpb24oeCkgYXMubnVtZXJpYyh4W2ldKSkKICAgIAogICAgIyBDYWxjdWxhdGUgdGhlIGF2ZXJhZ2Ugb2YgVHJ1ZSBhbmQgRXhwZWN0ZWQgdmFsdWVzIGZvciB0aGUgaS10aCBwb3NpdGlvbgogICAgYXZlcmFnZV9iaWRbaSwgbl0gPC0gbWVhbihCaWRzLCBuYS5ybSA9IFRSVUUpCiAgICBhdmVyYWdlX2Fza1tpLCBuXSA8LSBtZWFuKEFza3MsIG5hLnJtID0gVFJVRSkKICB9Cn0KCiMgQ2FsY3VsYXRlIHRoZSBvdmVyYWxsIGF2ZXJhZ2UgZm9yIGVhY2ggcG9zaXRpb24gYWNyb3NzIGFsbCBzaW11bGF0aW9ucwpvdmVyYWxsX2F2ZXJhZ2VfYmlkIDwtIHJvd01lYW5zKGF2ZXJhZ2VfYmlkLCBuYS5ybSA9IFRSVUUpCm92ZXJhbGxfYXZlcmFnZV9hc2sgPC0gcm93TWVhbnMoYXZlcmFnZV9hc2ssIG5hLnJtID0gVFJVRSkKCiMgUGxvdCB0aGUgb3ZlcmFsbCBhdmVyYWdlcwpwbG90KG92ZXJhbGxfYXZlcmFnZV9iaWQsIHR5cGUgPSAibCIsIHBjaCA9IDE2LCBjb2wgPSAiYmx1ZSIsIG1haW4gPSAiT3ZlcmFsbCBBdmVyYWdlIG9mIEJpZHMgdnMgQXNrcyIsIHhsYWIgPSAiUG9zaXRpb24gaW4gTGlzdCIsIHlsYWIgPSAiVmFsdWUiLCB5bGltID0gYyhtaW4oYyhvdmVyYWxsX2F2ZXJhZ2VfYmlkLCBvdmVyYWxsX2F2ZXJhZ2VfYXNrKSksIG1heChjKG92ZXJhbGxfYXZlcmFnZV9iaWQsIG92ZXJhbGxfYXZlcmFnZV9hc2spKSkpCmxpbmVzKG92ZXJhbGxfYXZlcmFnZV9hc2ssIHR5cGUgPSAibCIsIHBjaCA9IDE2LCBjb2wgPSAicmVkIikKbGVnZW5kKCJ0b3ByaWdodCIsIGxlZ2VuZCA9IGMoIkJpZHMiLCAiQXNrcyIpLCBjb2wgPSBjKCJibHVlIiwgInJlZCIpLCBsdHkgPSAxLCBjZXggPSAwLjgpCmBgYAoKYGBge3J9CiMgSW5pdGlhbGl6ZSBtYXRyaWNlcyB0byBzdG9yZSBhdmVyYWdlcyBmb3IgZWFjaCBwb3NpdGlvbgphdmVyYWdlX2JpZCA8LSBtYXRyaXgoTkEsIG5yb3cgPSAxMDAsIG5jb2wgPSAxMCkKYXZlcmFnZV9hc2sgPC0gbWF0cml4KE5BLCBucm93ID0gMTAwLCBuY29sID0gMTApCgojIExvb3AgdGhyb3VnaCBlYWNoIHNpbXVsYXRpb24gKG4pCmZvciAobiBpbiAxOjEwKSB7CiAgIyBFeHRyYWN0IFRydWUgdmFsdWVzIGZyb20gdGhlIGFnZ3JlZ2F0ZWRfcmVzdWx0c180IGRhdGFmcmFtZQogIEJpZHNfc2V0OSA8LSBzdHJzcGxpdChnc3ViKCJcXFt8XFxdIiwgIiIsIHVubGlzdChhZ2dyZWdhdGVkX3Jlc3VsdHNfOVtuLCA0XSkpLCAiLCAiKQogIAogICMgRXh0cmFjdCBFeHBlY3RlZCB2YWx1ZXMgZnJvbSB0aGUgYWdncmVnYXRlZF9yZXN1bHRzXzQgZGF0YWZyYW1lCiAgQXNrc19zZXQ5IDwtIHN0cnNwbGl0KGdzdWIoIlxcW3xcXF0iLCAiIiwgdW5saXN0KGFnZ3JlZ2F0ZWRfcmVzdWx0c185W24sIDVdKSksICIsICIpCiAgCiAgIyBMb29wIHRocm91Z2ggZWFjaCBwb3NpdGlvbiAoaSkKICBmb3IgKGkgaW4gMToxMDApIHsKICAgICMgRXh0cmFjdCBUcnVlIGFuZCBFeHBlY3RlZCB2YWx1ZXMgZm9yIHRoZSBpLXRoIHBvc2l0aW9uCiAgICBCaWRzIDwtIHNhcHBseShCaWRzX3NldDksIGZ1bmN0aW9uKHgpIGFzLm51bWVyaWMoeFtpXSkpCiAgICBBc2tzIDwtIHNhcHBseShBc2tzX3NldDksIGZ1bmN0aW9uKHgpIGFzLm51bWVyaWMoeFtpXSkpCiAgICAKICAgICMgQ2FsY3VsYXRlIHRoZSBhdmVyYWdlIG9mIFRydWUgYW5kIEV4cGVjdGVkIHZhbHVlcyBmb3IgdGhlIGktdGggcG9zaXRpb24KICAgIGF2ZXJhZ2VfYmlkW2ksIG5dIDwtIG1lYW4oQmlkcywgbmEucm0gPSBUUlVFKQogICAgYXZlcmFnZV9hc2tbaSwgbl0gPC0gbWVhbihBc2tzLCBuYS5ybSA9IFRSVUUpCiAgfQp9CgojIENhbGN1bGF0ZSB0aGUgb3ZlcmFsbCBhdmVyYWdlIGZvciBlYWNoIHBvc2l0aW9uIGFjcm9zcyBhbGwgc2ltdWxhdGlvbnMKb3ZlcmFsbF9hdmVyYWdlX2JpZCA8LSByb3dNZWFucyhhdmVyYWdlX2JpZCwgbmEucm0gPSBUUlVFKQpvdmVyYWxsX2F2ZXJhZ2VfYXNrIDwtIHJvd01lYW5zKGF2ZXJhZ2VfYXNrLCBuYS5ybSA9IFRSVUUpCgojIyBUcnVlIFZhbHVlCiMgSW5pdGlhbGl6ZSBtYXRyaWNlcyB0byBzdG9yZSBhdmVyYWdlcyBmb3IgZWFjaCBwb3NpdGlvbgphdmVyYWdlX3RydWUgPC0gbWF0cml4KE5BLCBucm93ID0gMTAwLCBuY29sID0gMTApCmF2ZXJhZ2VfZXhwZWN0ZWQgPC0gbWF0cml4KE5BLCBucm93ID0gMTAwLCBuY29sID0gMTApCgojIExvb3AgdGhyb3VnaCBlYWNoIHNpbXVsYXRpb24gKG4pCmZvciAobiBpbiAxOjEwKSB7CiAgIyBFeHRyYWN0IFRydWUgdmFsdWVzIGZyb20gdGhlIGFnZ3JlZ2F0ZWRfcmVzdWx0c180IGRhdGFmcmFtZQogIFRydWVWYWx1ZXNfc2V0OSA8LSBzdHJzcGxpdChnc3ViKCJcXFt8XFxdIiwgIiIsIHVubGlzdChhZ2dyZWdhdGVkX3Jlc3VsdHNfOVtuLCAyXSkpLCAiLCAiKQogIAogICMgRXh0cmFjdCBFeHBlY3RlZCB2YWx1ZXMgZnJvbSB0aGUgYWdncmVnYXRlZF9yZXN1bHRzXzQgZGF0YWZyYW1lCiAgRXhwZWN0ZWRWYWx1ZXNfc2V0OSA8LSBzdHJzcGxpdChnc3ViKCJcXFt8XFxdIiwgIiIsIHVubGlzdChhZ2dyZWdhdGVkX3Jlc3VsdHNfOVtuLCAzXSkpLCAiLCAiKQogIAogICMgTG9vcCB0aHJvdWdoIGVhY2ggcG9zaXRpb24gKGkpCiAgZm9yIChpIGluIDE6MTAwKSB7CiAgICAjIEV4dHJhY3QgVHJ1ZSBhbmQgRXhwZWN0ZWQgdmFsdWVzIGZvciB0aGUgaS10aCBwb3NpdGlvbgogICAgVHJ1ZV92YWx1ZXMgPC0gc2FwcGx5KFRydWVWYWx1ZXNfc2V0OSwgZnVuY3Rpb24oeCkgYXMubnVtZXJpYyh4W2ldKSkKICAgIEV4cGVjdGVkX3ZhbHVlcyA8LSBzYXBwbHkoRXhwZWN0ZWRWYWx1ZXNfc2V0OSwgZnVuY3Rpb24oeCkgYXMubnVtZXJpYyh4W2ldKSkKICAgIAogICAgIyBDYWxjdWxhdGUgdGhlIGF2ZXJhZ2Ugb2YgVHJ1ZSBhbmQgRXhwZWN0ZWQgdmFsdWVzIGZvciB0aGUgaS10aCBwb3NpdGlvbgogICAgYXZlcmFnZV90cnVlW2ksIG5dIDwtIG1lYW4oVHJ1ZV92YWx1ZXMsIG5hLnJtID0gVFJVRSkKICAgIGF2ZXJhZ2VfZXhwZWN0ZWRbaSwgbl0gPC0gbWVhbihFeHBlY3RlZF92YWx1ZXMsIG5hLnJtID0gVFJVRSkKICB9Cn0KCiMgQ2FsY3VsYXRlIHRoZSBvdmVyYWxsIGF2ZXJhZ2UgZm9yIGVhY2ggcG9zaXRpb24gYWNyb3NzIGFsbCBzaW11bGF0aW9ucwpvdmVyYWxsX2F2ZXJhZ2VfdHJ1ZSA8LSByb3dNZWFucyhhdmVyYWdlX3RydWUsIG5hLnJtID0gVFJVRSkKb3ZlcmFsbF9hdmVyYWdlX2V4cGVjdGVkIDwtIHJvd01lYW5zKGF2ZXJhZ2VfZXhwZWN0ZWQsIG5hLnJtID0gVFJVRSkKCiMgUGxvdCB0aGUgb3ZlcmFsbCBhdmVyYWdlcwojcGxvdChvdmVyYWxsX2F2ZXJhZ2VfdHJ1ZSwgdHlwZSA9ICJsIiwgcGNoID0gMTYsIGNvbCA9ICJibHVlIiwgbWFpbiA9ICJPdmVyYWxsIEF2ZXJhZ2Ugb2YgVHJ1ZSB2cyBFeHBlY3RlZCBWYWx1ZXMiLCB4bGFiID0gIlBvc2l0aW9uIGluIExpc3QiLCB5bGFiID0gIlZhbHVlIiwgeWxpbSA9IGMobWluKGMob3ZlcmFsbF9hdmVyYWdlX3RydWUsIG92ZXJhbGxfYXZlcmFnZV9leHBlY3RlZCkpLCBtYXgoYyhvdmVyYWxsX2F2ZXJhZ2VfdHJ1ZSwgb3ZlcmFsbF9hdmVyYWdlX2V4cGVjdGVkKSkpKQojbGluZXMob3ZlcmFsbF9hdmVyYWdlX2V4cGVjdGVkLCB0eXBlID0gImwiLCBwY2ggPSAxNiwgY29sID0gInJlZCIpCiNsZWdlbmQoInRvcHJpZ2h0IiwgbGVnZW5kID0gYygiVHJ1ZSBWYWx1ZXMiLCAiRXhwZWN0ZWQgVmFsdWVzIiksIGNvbCA9IGMoImJsdWUiLCAicmVkIiksIGx0eSA9IDEsIGNleCA9IDAuOCkKCiMgUGxvdCB0aGUgb3ZlcmFsbCBhdmVyYWdlcwpwbG90KG92ZXJhbGxfYXZlcmFnZV9iaWQsIHR5cGUgPSAibCIsIHBjaCA9IDE2LCBjb2wgPSAiYmx1ZSIsIG1haW4gPSAiT3ZlcmFsbCBBdmVyYWdlIG9mIEJpZHMgdnMgQXNrcyAmIFRydWUgdnMgRXhwZWN0ZWQgVmFsdWVzIiwgeGxhYiA9ICJQb3NpdGlvbiBpbiBMaXN0IiwgeWxhYiA9ICJWYWx1ZSIsIHlsaW0gPSBjKG1pbihjKG92ZXJhbGxfYXZlcmFnZV9iaWQsIG92ZXJhbGxfYXZlcmFnZV9hc2ssIG92ZXJhbGxfYXZlcmFnZV90cnVlLCBvdmVyYWxsX2F2ZXJhZ2VfZXhwZWN0ZWQpKSwgbWF4KGMob3ZlcmFsbF9hdmVyYWdlX2JpZCwgb3ZlcmFsbF9hdmVyYWdlX2Fzaywgb3ZlcmFsbF9hdmVyYWdlX3RydWUsIG92ZXJhbGxfYXZlcmFnZV9leHBlY3RlZCkpKSkKbGluZXMob3ZlcmFsbF9hdmVyYWdlX2FzaywgdHlwZSA9ICJsIiwgcGNoID0gMTYsIGNvbCA9ICJyZWQiKQpsaW5lcyhvdmVyYWxsX2F2ZXJhZ2VfdHJ1ZSwgdHlwZSA9ICJsIiwgcGNoID0gMTYsIGNvbCA9ICJncmVlbiIpCmxpbmVzKG92ZXJhbGxfYXZlcmFnZV9leHBlY3RlZCwgdHlwZSA9ICJsIiwgcGNoID0gMTYsIGNvbCA9ICJwdXJwbGUiKQpsZWdlbmQoImJvdHRvbWxlZnQiLCBsZWdlbmQgPSBjKCJCaWRzIiwgIkFza3MiLCAiVHJ1ZSBWYWx1ZSIsICJFeHBlY3RlZCBWYWx1ZSIpLCBjb2wgPSBjKCJibHVlIiwgInJlZCIsICJncmVlbiIsICJwdXJwbGUiKSwgbHR5ID0gMSwgY2V4ID0gMC44KQpgYGAKCgpgYGB7cn0KIyBJbml0aWFsaXplIG1hdHJpY2VzIHRvIHN0b3JlIGF2ZXJhZ2VzIGZvciBlYWNoIHBvc2l0aW9uCmF2ZXJhZ2VfTU1fcG5sIDwtIG1hdHJpeChOQSwgbnJvdyA9IDEwMCwgbmNvbCA9IDEwKQphdmVyYWdlX01SMV9wbmwgPC0gbWF0cml4KE5BLCBucm93ID0gMTAwLCBuY29sID0gMTApCmF2ZXJhZ2VfTVIyX3BubCA8LSBtYXRyaXgoTkEsIG5yb3cgPSAxMDAsIG5jb2wgPSAxMCkKYXZlcmFnZV9NUjNfcG5sIDwtIG1hdHJpeChOQSwgbnJvdyA9IDEwMCwgbmNvbCA9IDEwKQphdmVyYWdlX01SNF9wbmwgPC0gbWF0cml4KE5BLCBucm93ID0gMTAwLCBuY29sID0gMTApCmF2ZXJhZ2VfTVI1X3BubCA8LSBtYXRyaXgoTkEsIG5yb3cgPSAxMDAsIG5jb2wgPSAxMCkKYXZlcmFnZV9NUjZfcG5sIDwtIG1hdHJpeChOQSwgbnJvdyA9IDEwMCwgbmNvbCA9IDEwKQoKIyBMb29wIHRocm91Z2ggZWFjaCBzaW11bGF0aW9uIChuKQpmb3IgKG4gaW4gMToxMCkgewoKICBNTV9wbmxfc2V0OSA8LSBzdHJzcGxpdChnc3ViKCJcXFt8XFxdIiwgIiIsIHVubGlzdChhZ2dyZWdhdGVkX3Jlc3VsdHNfOVtuLCA2XSkpLCAiLCAiKQoKICBNUjFfcG5sX3NldDkgPC0gc3Ryc3BsaXQoZ3N1YigiXFxbfFxcXSIsICIiLCB1bmxpc3QoYWdncmVnYXRlZF9yZXN1bHRzXzlbbiwgOF0pKSwgIiwgIikKICAKICBNUjJfcG5sX3NldDkgPC0gc3Ryc3BsaXQoZ3N1YigiXFxbfFxcXSIsICIiLCB1bmxpc3QoYWdncmVnYXRlZF9yZXN1bHRzXzlbbiwgMTBdKSksICIsICIpCiAgCiAgTVIzX3BubF9zZXQ5IDwtIHN0cnNwbGl0KGdzdWIoIlxcW3xcXF0iLCAiIiwgdW5saXN0KGFnZ3JlZ2F0ZWRfcmVzdWx0c185W24sIDEyXSkpLCAiLCAiKQogIAogIE1SNF9wbmxfc2V0OSA8LSBzdHJzcGxpdChnc3ViKCJcXFt8XFxdIiwgIiIsIHVubGlzdChhZ2dyZWdhdGVkX3Jlc3VsdHNfOVtuLCAxNF0pKSwgIiwgIikKICAKICBNUjVfcG5sX3NldDkgPC0gc3Ryc3BsaXQoZ3N1YigiXFxbfFxcXSIsICIiLCB1bmxpc3QoYWdncmVnYXRlZF9yZXN1bHRzXzlbbiwgMTZdKSksICIsICIpCiAgCiAgTVI2X3BubF9zZXQ5IDwtIHN0cnNwbGl0KGdzdWIoIlxcW3xcXF0iLCAiIiwgdW5saXN0KGFnZ3JlZ2F0ZWRfcmVzdWx0c185W24sIDE4XSkpLCAiLCAiKQogIAogICMgTG9vcCB0aHJvdWdoIGVhY2ggcG9zaXRpb24gKGkpCiAgZm9yIChpIGluIDE6MTAwKSB7CiAgICAjIEV4dHJhY3QgVHJ1ZSBhbmQgRXhwZWN0ZWQgdmFsdWVzIGZvciB0aGUgaS10aCBwb3NpdGlvbgogICAgTU1fcG5sIDwtIHNhcHBseShNTV9wbmxfc2V0OSwgZnVuY3Rpb24oeCkgYXMubnVtZXJpYyh4W2ldKSkKICAgIE1SMV9wbmwgPC0gc2FwcGx5KE1SMV9wbmxfc2V0OSwgZnVuY3Rpb24oeCkgYXMubnVtZXJpYyh4W2ldKSkKICAgIE1SMl9wbmwgPC0gc2FwcGx5KE1SMl9wbmxfc2V0OSwgZnVuY3Rpb24oeCkgYXMubnVtZXJpYyh4W2ldKSkKICAgIE1SM19wbmwgPC0gc2FwcGx5KE1SM19wbmxfc2V0OSwgZnVuY3Rpb24oeCkgYXMubnVtZXJpYyh4W2ldKSkKICAgIE1SNF9wbmwgPC0gc2FwcGx5KE1SNF9wbmxfc2V0OSwgZnVuY3Rpb24oeCkgYXMubnVtZXJpYyh4W2ldKSkKICAgIE1SNV9wbmwgPC0gc2FwcGx5KE1SNV9wbmxfc2V0OSwgZnVuY3Rpb24oeCkgYXMubnVtZXJpYyh4W2ldKSkKICAgIE1SNl9wbmwgPC0gc2FwcGx5KE1SNl9wbmxfc2V0OSwgZnVuY3Rpb24oeCkgYXMubnVtZXJpYyh4W2ldKSkKICAgIAogICAgIyBDYWxjdWxhdGUgdGhlIGF2ZXJhZ2Ugb2YgVHJ1ZSBhbmQgRXhwZWN0ZWQgdmFsdWVzIGZvciB0aGUgaS10aCBwb3NpdGlvbgogICAgYXZlcmFnZV9NTV9wbmxbaSwgbl0gPC0gbWVhbihNTV9wbmwsIG5hLnJtID0gVFJVRSkKICAgIGF2ZXJhZ2VfTVIxX3BubFtpLCBuXSA8LSBtZWFuKE1SMV9wbmwsIG5hLnJtID0gVFJVRSkKICAgIGF2ZXJhZ2VfTVIyX3BubFtpLCBuXSA8LSBtZWFuKE1SMl9wbmwsIG5hLnJtID0gVFJVRSkKICAgIGF2ZXJhZ2VfTVIzX3BubFtpLCBuXSA8LSBtZWFuKE1SM19wbmwsIG5hLnJtID0gVFJVRSkKICAgIGF2ZXJhZ2VfTVI0X3BubFtpLCBuXSA8LSBtZWFuKE1SNF9wbmwsIG5hLnJtID0gVFJVRSkKICAgIGF2ZXJhZ2VfTVI1X3BubFtpLCBuXSA8LSBtZWFuKE1SNV9wbmwsIG5hLnJtID0gVFJVRSkKICAgIGF2ZXJhZ2VfTVI2X3BubFtpLCBuXSA8LSBtZWFuKE1SNl9wbmwsIG5hLnJtID0gVFJVRSkKICB9Cn0KCiMgQ2FsY3VsYXRlIHRoZSBvdmVyYWxsIGF2ZXJhZ2UgZm9yIGVhY2ggcG9zaXRpb24gYWNyb3NzIGFsbCBzaW11bGF0aW9ucwpvdmVyYWxsX2F2ZXJhZ2VfTU1fcG5sIDwtIHJvd01lYW5zKGF2ZXJhZ2VfTU1fcG5sLCBuYS5ybSA9IFRSVUUpCm92ZXJhbGxfYXZlcmFnZV9NUjFfcG5sIDwtIHJvd01lYW5zKGF2ZXJhZ2VfTVIxX3BubCwgbmEucm0gPSBUUlVFKQpvdmVyYWxsX2F2ZXJhZ2VfTVIyX3BubCA8LSByb3dNZWFucyhhdmVyYWdlX01SMl9wbmwsIG5hLnJtID0gVFJVRSkKb3ZlcmFsbF9hdmVyYWdlX01SM19wbmwgPC0gcm93TWVhbnMoYXZlcmFnZV9NUjNfcG5sLCBuYS5ybSA9IFRSVUUpCm92ZXJhbGxfYXZlcmFnZV9NUjRfcG5sIDwtIHJvd01lYW5zKGF2ZXJhZ2VfTVI0X3BubCwgbmEucm0gPSBUUlVFKQpvdmVyYWxsX2F2ZXJhZ2VfTVI1X3BubCA8LSByb3dNZWFucyhhdmVyYWdlX01SNV9wbmwsIG5hLnJtID0gVFJVRSkKb3ZlcmFsbF9hdmVyYWdlX01SNl9wbmwgPC0gcm93TWVhbnMoYXZlcmFnZV9NUjZfcG5sLCBuYS5ybSA9IFRSVUUpCgojIFBsb3QgdGhlIG92ZXJhbGwgYXZlcmFnZXMKcGxvdChvdmVyYWxsX2F2ZXJhZ2VfTU1fcG5sLCB0eXBlID0gImwiLCBwY2ggPSAxNiwgY29sID0gImJsYWNrIiwgbWFpbiA9ICJPdmVyYWxsIEF2ZXJhZ2UgUE5MIiwgeGxhYiA9ICJQb3NpdGlvbiBpbiBMaXN0IiwgeWxhYiA9ICJWYWx1ZSIsIHlsaW0gPSBjKG1pbihjKG92ZXJhbGxfYXZlcmFnZV9NTV9wbmwsIG92ZXJhbGxfYXZlcmFnZV9NUjFfcG5sLCBvdmVyYWxsX2F2ZXJhZ2VfTVIyX3BubCwgb3ZlcmFsbF9hdmVyYWdlX01SM19wbmwsIG92ZXJhbGxfYXZlcmFnZV9NUjRfcG5sLCBvdmVyYWxsX2F2ZXJhZ2VfTVI1X3BubCwgb3ZlcmFsbF9hdmVyYWdlX01SNl9wbmwpKSwgbWF4KGMob3ZlcmFsbF9hdmVyYWdlX01NX3BubCwgb3ZlcmFsbF9hdmVyYWdlX01SMV9wbmwsIG92ZXJhbGxfYXZlcmFnZV9NUjJfcG5sLCBvdmVyYWxsX2F2ZXJhZ2VfTVIzX3BubCwgb3ZlcmFsbF9hdmVyYWdlX01SNF9wbmwsIG92ZXJhbGxfYXZlcmFnZV9NUjVfcG5sLCBvdmVyYWxsX2F2ZXJhZ2VfTVI2X3BubCkpKSkKbGluZXMob3ZlcmFsbF9hdmVyYWdlX01SMV9wbmwsIHR5cGUgPSAibCIsIHBjaCA9IDE2LCBjb2wgPSAicmVkIikKbGluZXMob3ZlcmFsbF9hdmVyYWdlX01SMl9wbmwsIHR5cGUgPSAibCIsIHBjaCA9IDE2LCBjb2wgPSAiZ3JlZW4iKQpsaW5lcyhvdmVyYWxsX2F2ZXJhZ2VfTVIzX3BubCwgdHlwZSA9ICJsIiwgcGNoID0gMTYsIGNvbCA9ICJ5ZWxsb3ciKQpsaW5lcyhvdmVyYWxsX2F2ZXJhZ2VfTVI0X3BubCwgdHlwZSA9ICJsIiwgcGNoID0gMTYsIGNvbCA9ICJibHVlIikKbGluZXMob3ZlcmFsbF9hdmVyYWdlX01SNV9wbmwsIHR5cGUgPSAibCIsIHBjaCA9IDE2LCBjb2wgPSAicHVycGxlIikKbGluZXMob3ZlcmFsbF9hdmVyYWdlX01SNl9wbmwsIHR5cGUgPSAibCIsIHBjaCA9IDE2LCBjb2wgPSAib3JhbmdlIikKCiMgQWRkIGxlZ2VuZApsZWdlbmQoImJvdHRvbWxlZnQiLCBsZWdlbmQgPSBjKCJNYXJrZXQgTWFrZXIiLCAiTVIxIiwgIk1SMiIsICJNUjMiLCAiTVI0IiwgIk1SNSIsICJNUjYiKSwgY29sID0gYygiYmxhY2siLCAicmVkIiwgImdyZWVuIiwgInllbGxvdyIsICJibHVlIiwgInB1cnBsZSIsICJvcmFuZ2UiKSwgbHR5ID0gMSwgY2V4ID0gMC44KQpgYGAKCmBgYHtyfQojIEluaXRpYWxpemUgbWF0cmljZXMgdG8gc3RvcmUgYXZlcmFnZXMgZm9yIGVhY2ggcG9zaXRpb24KYXZlcmFnZV9NTV9wb3MgPC0gbWF0cml4KE5BLCBucm93ID0gMTAwLCBuY29sID0gMTApCmF2ZXJhZ2VfTVIxX3BvcyA8LSBtYXRyaXgoTkEsIG5yb3cgPSAxMDAsIG5jb2wgPSAxMCkKYXZlcmFnZV9NUjJfcG9zIDwtIG1hdHJpeChOQSwgbnJvdyA9IDEwMCwgbmNvbCA9IDEwKQphdmVyYWdlX01SM19wb3MgPC0gbWF0cml4KE5BLCBucm93ID0gMTAwLCBuY29sID0gMTApCmF2ZXJhZ2VfTVI0X3BvcyA8LSBtYXRyaXgoTkEsIG5yb3cgPSAxMDAsIG5jb2wgPSAxMCkKYXZlcmFnZV9NUjVfcG9zIDwtIG1hdHJpeChOQSwgbnJvdyA9IDEwMCwgbmNvbCA9IDEwKQphdmVyYWdlX01SNl9wb3MgPC0gbWF0cml4KE5BLCBucm93ID0gMTAwLCBuY29sID0gMTApCgojIExvb3AgdGhyb3VnaCBlYWNoIHNpbXVsYXRpb24gKG4pCmZvciAobiBpbiAxOjEwKSB7CgogIE1NX3Bvc19zZXQ5IDwtIHN0cnNwbGl0KGdzdWIoIlxcW3xcXF0iLCAiIiwgdW5saXN0KGFnZ3JlZ2F0ZWRfcmVzdWx0c185W24sIDddKSksICIsICIpCgogIE1SMV9wb3Nfc2V0OSA8LSBzdHJzcGxpdChnc3ViKCJcXFt8XFxdIiwgIiIsIHVubGlzdChhZ2dyZWdhdGVkX3Jlc3VsdHNfOVtuLCA5XSkpLCAiLCAiKQogIAogIE1SMl9wb3Nfc2V0OSA8LSBzdHJzcGxpdChnc3ViKCJcXFt8XFxdIiwgIiIsIHVubGlzdChhZ2dyZWdhdGVkX3Jlc3VsdHNfOVtuLCAxMV0pKSwgIiwgIikKICAKICBNUjNfcG9zX3NldDkgPC0gc3Ryc3BsaXQoZ3N1YigiXFxbfFxcXSIsICIiLCB1bmxpc3QoYWdncmVnYXRlZF9yZXN1bHRzXzlbbiwgMTNdKSksICIsICIpCiAgCiAgTVI0X3Bvc19zZXQ5IDwtIHN0cnNwbGl0KGdzdWIoIlxcW3xcXF0iLCAiIiwgdW5saXN0KGFnZ3JlZ2F0ZWRfcmVzdWx0c185W24sIDE1XSkpLCAiLCAiKQogIAogIE1SNV9wb3Nfc2V0OSA8LSBzdHJzcGxpdChnc3ViKCJcXFt8XFxdIiwgIiIsIHVubGlzdChhZ2dyZWdhdGVkX3Jlc3VsdHNfOVtuLCAxN10pKSwgIiwgIikKICAKICBNUjZfcG9zX3NldDkgPC0gc3Ryc3BsaXQoZ3N1YigiXFxbfFxcXSIsICIiLCB1bmxpc3QoYWdncmVnYXRlZF9yZXN1bHRzXzlbbiwgMTldKSksICIsICIpCiAgCiAgIyBMb29wIHRocm91Z2ggZWFjaCBwb3NpdGlvbiAoaSkKICBmb3IgKGkgaW4gMToxMDApIHsKICAgICMgRXh0cmFjdCBUcnVlIGFuZCBFeHBlY3RlZCB2YWx1ZXMgZm9yIHRoZSBpLXRoIHBvc2l0aW9uCiAgICBNTV9wb3MgPC0gc2FwcGx5KE1NX3Bvc19zZXQ5LCBmdW5jdGlvbih4KSBhcy5udW1lcmljKHhbaV0pKQogICAgTVIxX3BvcyA8LSBzYXBwbHkoTVIxX3Bvc19zZXQ5LCBmdW5jdGlvbih4KSBhcy5udW1lcmljKHhbaV0pKQogICAgTVIyX3BvcyA8LSBzYXBwbHkoTVIyX3Bvc19zZXQ5LCBmdW5jdGlvbih4KSBhcy5udW1lcmljKHhbaV0pKQogICAgTVIzX3BvcyA8LSBzYXBwbHkoTVIzX3Bvc19zZXQ5LCBmdW5jdGlvbih4KSBhcy5udW1lcmljKHhbaV0pKQogICAgTVI0X3BvcyA8LSBzYXBwbHkoTVI0X3Bvc19zZXQ5LCBmdW5jdGlvbih4KSBhcy5udW1lcmljKHhbaV0pKQogICAgTVI1X3BvcyA8LSBzYXBwbHkoTVI1X3Bvc19zZXQ5LCBmdW5jdGlvbih4KSBhcy5udW1lcmljKHhbaV0pKQogICAgTVI2X3BvcyA8LSBzYXBwbHkoTVI2X3Bvc19zZXQ5LCBmdW5jdGlvbih4KSBhcy5udW1lcmljKHhbaV0pKQogICAgCiAgICAjIENhbGN1bGF0ZSB0aGUgYXZlcmFnZSBvZiBUcnVlIGFuZCBFeHBlY3RlZCB2YWx1ZXMgZm9yIHRoZSBpLXRoIHBvc2l0aW9uCiAgICBhdmVyYWdlX01NX3Bvc1tpLCBuXSA8LSBtZWFuKE1NX3BvcywgbmEucm0gPSBUUlVFKQogICAgYXZlcmFnZV9NUjFfcG9zW2ksIG5dIDwtIG1lYW4oTVIxX3BvcywgbmEucm0gPSBUUlVFKQogICAgYXZlcmFnZV9NUjJfcG9zW2ksIG5dIDwtIG1lYW4oTVIyX3BvcywgbmEucm0gPSBUUlVFKQogICAgYXZlcmFnZV9NUjNfcG9zW2ksIG5dIDwtIG1lYW4oTVIzX3BvcywgbmEucm0gPSBUUlVFKQogICAgYXZlcmFnZV9NUjRfcG9zW2ksIG5dIDwtIG1lYW4oTVI0X3BvcywgbmEucm0gPSBUUlVFKQogICAgYXZlcmFnZV9NUjVfcG9zW2ksIG5dIDwtIG1lYW4oTVI1X3BvcywgbmEucm0gPSBUUlVFKQogICAgYXZlcmFnZV9NUjZfcG9zW2ksIG5dIDwtIG1lYW4oTVI2X3BvcywgbmEucm0gPSBUUlVFKQogIH0KfQoKIyBDYWxjdWxhdGUgdGhlIG92ZXJhbGwgYXZlcmFnZSBmb3IgZWFjaCBwb3NpdGlvbiBhY3Jvc3MgYWxsIHNpbXVsYXRpb25zCm92ZXJhbGxfYXZlcmFnZV9NTV9wb3MgPC0gcm93TWVhbnMoYXZlcmFnZV9NTV9wb3MsIG5hLnJtID0gVFJVRSkKb3ZlcmFsbF9hdmVyYWdlX01SMV9wb3MgPC0gcm93TWVhbnMoYXZlcmFnZV9NUjFfcG9zLCBuYS5ybSA9IFRSVUUpCm92ZXJhbGxfYXZlcmFnZV9NUjJfcG9zIDwtIHJvd01lYW5zKGF2ZXJhZ2VfTVIyX3BvcywgbmEucm0gPSBUUlVFKQpvdmVyYWxsX2F2ZXJhZ2VfTVIzX3BvcyA8LSByb3dNZWFucyhhdmVyYWdlX01SM19wb3MsIG5hLnJtID0gVFJVRSkKb3ZlcmFsbF9hdmVyYWdlX01SNF9wb3MgPC0gcm93TWVhbnMoYXZlcmFnZV9NUjRfcG9zLCBuYS5ybSA9IFRSVUUpCm92ZXJhbGxfYXZlcmFnZV9NUjVfcG9zIDwtIHJvd01lYW5zKGF2ZXJhZ2VfTVI1X3BvcywgbmEucm0gPSBUUlVFKQpvdmVyYWxsX2F2ZXJhZ2VfTVI2X3BvcyA8LSByb3dNZWFucyhhdmVyYWdlX01SNl9wb3MsIG5hLnJtID0gVFJVRSkKCiMgUGxvdCB0aGUgb3ZlcmFsbCBhdmVyYWdlcwpwbG90KG92ZXJhbGxfYXZlcmFnZV9NTV9wb3MsIHR5cGUgPSAibCIsIHBjaCA9IDE2LCBjb2wgPSAiYmxhY2siLCBtYWluID0gIk92ZXJhbGwgQXZlcmFnZSBQb3NpdGlvbiIsIHhsYWIgPSAiUG9zaXRpb24gaW4gTGlzdCIsIHlsYWIgPSAiVmFsdWUiLCB5bGltID0gYyhtaW4oYyhvdmVyYWxsX2F2ZXJhZ2VfTU1fcG9zLCBvdmVyYWxsX2F2ZXJhZ2VfTVIxX3Bvcywgb3ZlcmFsbF9hdmVyYWdlX01SMl9wb3MsIG92ZXJhbGxfYXZlcmFnZV9NUjNfcG9zLCBvdmVyYWxsX2F2ZXJhZ2VfTVI0X3Bvcywgb3ZlcmFsbF9hdmVyYWdlX01SNV9wb3MsIG92ZXJhbGxfYXZlcmFnZV9NUjZfcG9zKSksIG1heChjKG92ZXJhbGxfYXZlcmFnZV9NTV9wb3MsIG92ZXJhbGxfYXZlcmFnZV9NUjFfcG9zLCBvdmVyYWxsX2F2ZXJhZ2VfTVIyX3Bvcywgb3ZlcmFsbF9hdmVyYWdlX01SM19wb3MsIG92ZXJhbGxfYXZlcmFnZV9NUjRfcG9zLCBvdmVyYWxsX2F2ZXJhZ2VfTVI1X3Bvcywgb3ZlcmFsbF9hdmVyYWdlX01SNl9wb3MpKSkpCmxpbmVzKG92ZXJhbGxfYXZlcmFnZV9NUjFfcG9zLCB0eXBlID0gImwiLCBwY2ggPSAxNiwgY29sID0gInJlZCIpCmxpbmVzKG92ZXJhbGxfYXZlcmFnZV9NUjJfcG9zLCB0eXBlID0gImwiLCBwY2ggPSAxNiwgY29sID0gImdyZWVuIikKbGluZXMob3ZlcmFsbF9hdmVyYWdlX01SM19wb3MsIHR5cGUgPSAibCIsIHBjaCA9IDE2LCBjb2wgPSAieWVsbG93IikKbGluZXMob3ZlcmFsbF9hdmVyYWdlX01SNF9wb3MsIHR5cGUgPSAibCIsIHBjaCA9IDE2LCBjb2wgPSAiYmx1ZSIpCmxpbmVzKG92ZXJhbGxfYXZlcmFnZV9NUjVfcG9zLCB0eXBlID0gImwiLCBwY2ggPSAxNiwgY29sID0gInB1cnBsZSIpCmxpbmVzKG92ZXJhbGxfYXZlcmFnZV9NUjZfcG9zLCB0eXBlID0gImwiLCBwY2ggPSAxNiwgY29sID0gIm9yYW5nZSIpCgojIEFkZCBsZWdlbmQKbGVnZW5kKCJib3R0b21sZWZ0IiwgbGVnZW5kID0gYygiTWFya2V0IE1ha2VyIiwgIk1SMSIsICJNUjIiLCAiTVIzIiwgIk1SNCIsICJNUjUiLCAiTVI2IiksIGNvbCA9IGMoImJsYWNrIiwgInJlZCIsICJncmVlbiIsICJ5ZWxsb3ciLCAiYmx1ZSIsICJwdXJwbGUiLCAib3JhbmdlIiksIGx0eSA9IDEsIGNleCA9IDAuOCkKYGBgCgojIyBzZXQxMCAoTW9tIDogNikKCmBgYHtyfQojIEluaXRpYWxpemUgbWF0cmljZXMgdG8gc3RvcmUgYXZlcmFnZXMgZm9yIGVhY2ggcG9zaXRpb24KYXZlcmFnZV90cnVlIDwtIG1hdHJpeChOQSwgbnJvdyA9IDEwMCwgbmNvbCA9IDEwKQphdmVyYWdlX2V4cGVjdGVkIDwtIG1hdHJpeChOQSwgbnJvdyA9IDEwMCwgbmNvbCA9IDEwKQoKIyBMb29wIHRocm91Z2ggZWFjaCBzaW11bGF0aW9uIChuKQpmb3IgKG4gaW4gMToxMCkgewogICMgRXh0cmFjdCBUcnVlIHZhbHVlcyBmcm9tIHRoZSBhZ2dyZWdhdGVkX3Jlc3VsdHNfNCBkYXRhZnJhbWUKICBUcnVlVmFsdWVzX3NldDEwIDwtIHN0cnNwbGl0KGdzdWIoIlxcW3xcXF0iLCAiIiwgdW5saXN0KGFnZ3JlZ2F0ZWRfcmVzdWx0c18xMFtuLCAyXSkpLCAiLCAiKQogIAogICMgRXh0cmFjdCBFeHBlY3RlZCB2YWx1ZXMgZnJvbSB0aGUgYWdncmVnYXRlZF9yZXN1bHRzXzQgZGF0YWZyYW1lCiAgRXhwZWN0ZWRWYWx1ZXNfc2V0MTAgPC0gc3Ryc3BsaXQoZ3N1YigiXFxbfFxcXSIsICIiLCB1bmxpc3QoYWdncmVnYXRlZF9yZXN1bHRzXzEwW24sIDNdKSksICIsICIpCiAgCiAgIyBMb29wIHRocm91Z2ggZWFjaCBwb3NpdGlvbiAoaSkKICBmb3IgKGkgaW4gMToxMDApIHsKICAgICMgRXh0cmFjdCBUcnVlIGFuZCBFeHBlY3RlZCB2YWx1ZXMgZm9yIHRoZSBpLXRoIHBvc2l0aW9uCiAgICBUcnVlX3ZhbHVlcyA8LSBzYXBwbHkoVHJ1ZVZhbHVlc19zZXQxMCwgZnVuY3Rpb24oeCkgYXMubnVtZXJpYyh4W2ldKSkKICAgIEV4cGVjdGVkX3ZhbHVlcyA8LSBzYXBwbHkoRXhwZWN0ZWRWYWx1ZXNfc2V0MTAsIGZ1bmN0aW9uKHgpIGFzLm51bWVyaWMoeFtpXSkpCiAgICAKICAgICMgQ2FsY3VsYXRlIHRoZSBhdmVyYWdlIG9mIFRydWUgYW5kIEV4cGVjdGVkIHZhbHVlcyBmb3IgdGhlIGktdGggcG9zaXRpb24KICAgIGF2ZXJhZ2VfdHJ1ZVtpLCBuXSA8LSBtZWFuKFRydWVfdmFsdWVzLCBuYS5ybSA9IFRSVUUpCiAgICBhdmVyYWdlX2V4cGVjdGVkW2ksIG5dIDwtIG1lYW4oRXhwZWN0ZWRfdmFsdWVzLCBuYS5ybSA9IFRSVUUpCiAgfQp9CgojIENhbGN1bGF0ZSB0aGUgb3ZlcmFsbCBhdmVyYWdlIGZvciBlYWNoIHBvc2l0aW9uIGFjcm9zcyBhbGwgc2ltdWxhdGlvbnMKb3ZlcmFsbF9hdmVyYWdlX3RydWUgPC0gcm93TWVhbnMoYXZlcmFnZV90cnVlLCBuYS5ybSA9IFRSVUUpCm92ZXJhbGxfYXZlcmFnZV9leHBlY3RlZCA8LSByb3dNZWFucyhhdmVyYWdlX2V4cGVjdGVkLCBuYS5ybSA9IFRSVUUpCgojIFBsb3QgdGhlIG92ZXJhbGwgYXZlcmFnZXMKcGxvdChvdmVyYWxsX2F2ZXJhZ2VfdHJ1ZSwgdHlwZSA9ICJsIiwgcGNoID0gMTYsIGNvbCA9ICJibHVlIiwgbWFpbiA9ICJPdmVyYWxsIEF2ZXJhZ2Ugb2YgVHJ1ZSB2cyBFeHBlY3RlZCBWYWx1ZXMiLCB4bGFiID0gIlBvc2l0aW9uIGluIExpc3QiLCB5bGFiID0gIlZhbHVlIiwgeWxpbSA9IGMobWluKGMob3ZlcmFsbF9hdmVyYWdlX3RydWUsIG92ZXJhbGxfYXZlcmFnZV9leHBlY3RlZCkpLCBtYXgoYyhvdmVyYWxsX2F2ZXJhZ2VfdHJ1ZSwgb3ZlcmFsbF9hdmVyYWdlX2V4cGVjdGVkKSkpKQpsaW5lcyhvdmVyYWxsX2F2ZXJhZ2VfZXhwZWN0ZWQsIHR5cGUgPSAibCIsIHBjaCA9IDE2LCBjb2wgPSAicmVkIikKbGVnZW5kKCJ0b3ByaWdodCIsIGxlZ2VuZCA9IGMoIlRydWUgVmFsdWVzIiwgIkV4cGVjdGVkIFZhbHVlcyIpLCBjb2wgPSBjKCJibHVlIiwgInJlZCIpLCBsdHkgPSAxLCBjZXggPSAwLjgpCmBgYAoKCgoKYGBge3J9CiMgSW5pdGlhbGl6ZSBtYXRyaWNlcyB0byBzdG9yZSBhdmVyYWdlcyBmb3IgZWFjaCBwb3NpdGlvbgphdmVyYWdlX2JpZCA8LSBtYXRyaXgoTkEsIG5yb3cgPSAxMDAsIG5jb2wgPSAxMCkKYXZlcmFnZV9hc2sgPC0gbWF0cml4KE5BLCBucm93ID0gMTAwLCBuY29sID0gMTApCgojIExvb3AgdGhyb3VnaCBlYWNoIHNpbXVsYXRpb24gKG4pCmZvciAobiBpbiAxOjEwKSB7CiAgIyBFeHRyYWN0IFRydWUgdmFsdWVzIGZyb20gdGhlIGFnZ3JlZ2F0ZWRfcmVzdWx0c180IGRhdGFmcmFtZQogIEJpZHNfc2V0MTAgPC0gc3Ryc3BsaXQoZ3N1YigiXFxbfFxcXSIsICIiLCB1bmxpc3QoYWdncmVnYXRlZF9yZXN1bHRzXzEwW24sIDRdKSksICIsICIpCiAgCiAgIyBFeHRyYWN0IEV4cGVjdGVkIHZhbHVlcyBmcm9tIHRoZSBhZ2dyZWdhdGVkX3Jlc3VsdHNfNCBkYXRhZnJhbWUKICBBc2tzX3NldDEwIDwtIHN0cnNwbGl0KGdzdWIoIlxcW3xcXF0iLCAiIiwgdW5saXN0KGFnZ3JlZ2F0ZWRfcmVzdWx0c18xMFtuLCA1XSkpLCAiLCAiKQogIAogICMgTG9vcCB0aHJvdWdoIGVhY2ggcG9zaXRpb24gKGkpCiAgZm9yIChpIGluIDE6MTAwKSB7CiAgICAjIEV4dHJhY3QgVHJ1ZSBhbmQgRXhwZWN0ZWQgdmFsdWVzIGZvciB0aGUgaS10aCBwb3NpdGlvbgogICAgQmlkcyA8LSBzYXBwbHkoQmlkc19zZXQxMCwgZnVuY3Rpb24oeCkgYXMubnVtZXJpYyh4W2ldKSkKICAgIEFza3MgPC0gc2FwcGx5KEFza3Nfc2V0MTAsIGZ1bmN0aW9uKHgpIGFzLm51bWVyaWMoeFtpXSkpCiAgICAKICAgICMgQ2FsY3VsYXRlIHRoZSBhdmVyYWdlIG9mIFRydWUgYW5kIEV4cGVjdGVkIHZhbHVlcyBmb3IgdGhlIGktdGggcG9zaXRpb24KICAgIGF2ZXJhZ2VfYmlkW2ksIG5dIDwtIG1lYW4oQmlkcywgbmEucm0gPSBUUlVFKQogICAgYXZlcmFnZV9hc2tbaSwgbl0gPC0gbWVhbihBc2tzLCBuYS5ybSA9IFRSVUUpCiAgfQp9CgojIENhbGN1bGF0ZSB0aGUgb3ZlcmFsbCBhdmVyYWdlIGZvciBlYWNoIHBvc2l0aW9uIGFjcm9zcyBhbGwgc2ltdWxhdGlvbnMKb3ZlcmFsbF9hdmVyYWdlX2JpZCA8LSByb3dNZWFucyhhdmVyYWdlX2JpZCwgbmEucm0gPSBUUlVFKQpvdmVyYWxsX2F2ZXJhZ2VfYXNrIDwtIHJvd01lYW5zKGF2ZXJhZ2VfYXNrLCBuYS5ybSA9IFRSVUUpCgojIFBsb3QgdGhlIG92ZXJhbGwgYXZlcmFnZXMKcGxvdChvdmVyYWxsX2F2ZXJhZ2VfYmlkLCB0eXBlID0gImwiLCBwY2ggPSAxNiwgY29sID0gImJsdWUiLCBtYWluID0gIk92ZXJhbGwgQXZlcmFnZSBvZiBCaWRzIHZzIEFza3MiLCB4bGFiID0gIlBvc2l0aW9uIGluIExpc3QiLCB5bGFiID0gIlZhbHVlIiwgeWxpbSA9IGMobWluKGMob3ZlcmFsbF9hdmVyYWdlX2JpZCwgb3ZlcmFsbF9hdmVyYWdlX2FzaykpLCBtYXgoYyhvdmVyYWxsX2F2ZXJhZ2VfYmlkLCBvdmVyYWxsX2F2ZXJhZ2VfYXNrKSkpKQpsaW5lcyhvdmVyYWxsX2F2ZXJhZ2VfYXNrLCB0eXBlID0gImwiLCBwY2ggPSAxNiwgY29sID0gInJlZCIpCmxlZ2VuZCgidG9wcmlnaHQiLCBsZWdlbmQgPSBjKCJCaWRzIiwgIkFza3MiKSwgY29sID0gYygiYmx1ZSIsICJyZWQiKSwgbHR5ID0gMSwgY2V4ID0gMC44KQpgYGAKCmBgYHtyfQojIEluaXRpYWxpemUgbWF0cmljZXMgdG8gc3RvcmUgYXZlcmFnZXMgZm9yIGVhY2ggcG9zaXRpb24KYXZlcmFnZV9iaWQgPC0gbWF0cml4KE5BLCBucm93ID0gMTAwLCBuY29sID0gMTApCmF2ZXJhZ2VfYXNrIDwtIG1hdHJpeChOQSwgbnJvdyA9IDEwMCwgbmNvbCA9IDEwKQoKIyBMb29wIHRocm91Z2ggZWFjaCBzaW11bGF0aW9uIChuKQpmb3IgKG4gaW4gMToxMCkgewogICMgRXh0cmFjdCBUcnVlIHZhbHVlcyBmcm9tIHRoZSBhZ2dyZWdhdGVkX3Jlc3VsdHNfNCBkYXRhZnJhbWUKICBCaWRzX3NldDEwIDwtIHN0cnNwbGl0KGdzdWIoIlxcW3xcXF0iLCAiIiwgdW5saXN0KGFnZ3JlZ2F0ZWRfcmVzdWx0c18xMFtuLCA0XSkpLCAiLCAiKQogIAogICMgRXh0cmFjdCBFeHBlY3RlZCB2YWx1ZXMgZnJvbSB0aGUgYWdncmVnYXRlZF9yZXN1bHRzXzQgZGF0YWZyYW1lCiAgQXNrc19zZXQxMCA8LSBzdHJzcGxpdChnc3ViKCJcXFt8XFxdIiwgIiIsIHVubGlzdChhZ2dyZWdhdGVkX3Jlc3VsdHNfMTBbbiwgNV0pKSwgIiwgIikKICAKICAjIExvb3AgdGhyb3VnaCBlYWNoIHBvc2l0aW9uIChpKQogIGZvciAoaSBpbiAxOjEwMCkgewogICAgIyBFeHRyYWN0IFRydWUgYW5kIEV4cGVjdGVkIHZhbHVlcyBmb3IgdGhlIGktdGggcG9zaXRpb24KICAgIEJpZHMgPC0gc2FwcGx5KEJpZHNfc2V0MTAsIGZ1bmN0aW9uKHgpIGFzLm51bWVyaWMoeFtpXSkpCiAgICBBc2tzIDwtIHNhcHBseShBc2tzX3NldDEwLCBmdW5jdGlvbih4KSBhcy5udW1lcmljKHhbaV0pKQogICAgCiAgICAjIENhbGN1bGF0ZSB0aGUgYXZlcmFnZSBvZiBUcnVlIGFuZCBFeHBlY3RlZCB2YWx1ZXMgZm9yIHRoZSBpLXRoIHBvc2l0aW9uCiAgICBhdmVyYWdlX2JpZFtpLCBuXSA8LSBtZWFuKEJpZHMsIG5hLnJtID0gVFJVRSkKICAgIGF2ZXJhZ2VfYXNrW2ksIG5dIDwtIG1lYW4oQXNrcywgbmEucm0gPSBUUlVFKQogIH0KfQoKIyBDYWxjdWxhdGUgdGhlIG92ZXJhbGwgYXZlcmFnZSBmb3IgZWFjaCBwb3NpdGlvbiBhY3Jvc3MgYWxsIHNpbXVsYXRpb25zCm92ZXJhbGxfYXZlcmFnZV9iaWQgPC0gcm93TWVhbnMoYXZlcmFnZV9iaWQsIG5hLnJtID0gVFJVRSkKb3ZlcmFsbF9hdmVyYWdlX2FzayA8LSByb3dNZWFucyhhdmVyYWdlX2FzaywgbmEucm0gPSBUUlVFKQoKIyMgVHJ1ZSBWYWx1ZQojIEluaXRpYWxpemUgbWF0cmljZXMgdG8gc3RvcmUgYXZlcmFnZXMgZm9yIGVhY2ggcG9zaXRpb24KYXZlcmFnZV90cnVlIDwtIG1hdHJpeChOQSwgbnJvdyA9IDEwMCwgbmNvbCA9IDEwKQphdmVyYWdlX2V4cGVjdGVkIDwtIG1hdHJpeChOQSwgbnJvdyA9IDEwMCwgbmNvbCA9IDEwKQoKIyBMb29wIHRocm91Z2ggZWFjaCBzaW11bGF0aW9uIChuKQpmb3IgKG4gaW4gMToxMCkgewogICMgRXh0cmFjdCBUcnVlIHZhbHVlcyBmcm9tIHRoZSBhZ2dyZWdhdGVkX3Jlc3VsdHNfNCBkYXRhZnJhbWUKICBUcnVlVmFsdWVzX3NldDEwIDwtIHN0cnNwbGl0KGdzdWIoIlxcW3xcXF0iLCAiIiwgdW5saXN0KGFnZ3JlZ2F0ZWRfcmVzdWx0c18xMFtuLCAyXSkpLCAiLCAiKQogIAogICMgRXh0cmFjdCBFeHBlY3RlZCB2YWx1ZXMgZnJvbSB0aGUgYWdncmVnYXRlZF9yZXN1bHRzXzQgZGF0YWZyYW1lCiAgRXhwZWN0ZWRWYWx1ZXNfc2V0MTAgPC0gc3Ryc3BsaXQoZ3N1YigiXFxbfFxcXSIsICIiLCB1bmxpc3QoYWdncmVnYXRlZF9yZXN1bHRzXzEwW24sIDNdKSksICIsICIpCiAgCiAgIyBMb29wIHRocm91Z2ggZWFjaCBwb3NpdGlvbiAoaSkKICBmb3IgKGkgaW4gMToxMDApIHsKICAgICMgRXh0cmFjdCBUcnVlIGFuZCBFeHBlY3RlZCB2YWx1ZXMgZm9yIHRoZSBpLXRoIHBvc2l0aW9uCiAgICBUcnVlX3ZhbHVlcyA8LSBzYXBwbHkoVHJ1ZVZhbHVlc19zZXQxMCwgZnVuY3Rpb24oeCkgYXMubnVtZXJpYyh4W2ldKSkKICAgIEV4cGVjdGVkX3ZhbHVlcyA8LSBzYXBwbHkoRXhwZWN0ZWRWYWx1ZXNfc2V0MSwgZnVuY3Rpb24oeCkgYXMubnVtZXJpYyh4W2ldKSkKICAgIAogICAgIyBDYWxjdWxhdGUgdGhlIGF2ZXJhZ2Ugb2YgVHJ1ZSBhbmQgRXhwZWN0ZWQgdmFsdWVzIGZvciB0aGUgaS10aCBwb3NpdGlvbgogICAgYXZlcmFnZV90cnVlW2ksIG5dIDwtIG1lYW4oVHJ1ZV92YWx1ZXMsIG5hLnJtID0gVFJVRSkKICAgIGF2ZXJhZ2VfZXhwZWN0ZWRbaSwgbl0gPC0gbWVhbihFeHBlY3RlZF92YWx1ZXMsIG5hLnJtID0gVFJVRSkKICB9Cn0KCiMgQ2FsY3VsYXRlIHRoZSBvdmVyYWxsIGF2ZXJhZ2UgZm9yIGVhY2ggcG9zaXRpb24gYWNyb3NzIGFsbCBzaW11bGF0aW9ucwpvdmVyYWxsX2F2ZXJhZ2VfdHJ1ZSA8LSByb3dNZWFucyhhdmVyYWdlX3RydWUsIG5hLnJtID0gVFJVRSkKb3ZlcmFsbF9hdmVyYWdlX2V4cGVjdGVkIDwtIHJvd01lYW5zKGF2ZXJhZ2VfZXhwZWN0ZWQsIG5hLnJtID0gVFJVRSkKCiMgUGxvdCB0aGUgb3ZlcmFsbCBhdmVyYWdlcwojcGxvdChvdmVyYWxsX2F2ZXJhZ2VfdHJ1ZSwgdHlwZSA9ICJsIiwgcGNoID0gMTYsIGNvbCA9ICJibHVlIiwgbWFpbiA9ICJPdmVyYWxsIEF2ZXJhZ2Ugb2YgVHJ1ZSB2cyBFeHBlY3RlZCBWYWx1ZXMiLCB4bGFiID0gIlBvc2l0aW9uIGluIExpc3QiLCB5bGFiID0gIlZhbHVlIiwgeWxpbSA9IGMobWluKGMob3ZlcmFsbF9hdmVyYWdlX3RydWUsIG92ZXJhbGxfYXZlcmFnZV9leHBlY3RlZCkpLCBtYXgoYyhvdmVyYWxsX2F2ZXJhZ2VfdHJ1ZSwgb3ZlcmFsbF9hdmVyYWdlX2V4cGVjdGVkKSkpKQojbGluZXMob3ZlcmFsbF9hdmVyYWdlX2V4cGVjdGVkLCB0eXBlID0gImwiLCBwY2ggPSAxNiwgY29sID0gInJlZCIpCiNsZWdlbmQoInRvcHJpZ2h0IiwgbGVnZW5kID0gYygiVHJ1ZSBWYWx1ZXMiLCAiRXhwZWN0ZWQgVmFsdWVzIiksIGNvbCA9IGMoImJsdWUiLCAicmVkIiksIGx0eSA9IDEsIGNleCA9IDAuOCkKCiMgUGxvdCB0aGUgb3ZlcmFsbCBhdmVyYWdlcwpwbG90KG92ZXJhbGxfYXZlcmFnZV9iaWQsIHR5cGUgPSAibCIsIHBjaCA9IDE2LCBjb2wgPSAiYmx1ZSIsIG1haW4gPSAiT3ZlcmFsbCBBdmVyYWdlIG9mIEJpZHMgdnMgQXNrcyAmIFRydWUgdnMgRXhwZWN0ZWQgVmFsdWVzIiwgeGxhYiA9ICJQb3NpdGlvbiBpbiBMaXN0IiwgeWxhYiA9ICJWYWx1ZSIsIHlsaW0gPSBjKG1pbihjKG92ZXJhbGxfYXZlcmFnZV9iaWQsIG92ZXJhbGxfYXZlcmFnZV9hc2ssIG92ZXJhbGxfYXZlcmFnZV90cnVlLCBvdmVyYWxsX2F2ZXJhZ2VfZXhwZWN0ZWQpKSwgbWF4KGMob3ZlcmFsbF9hdmVyYWdlX2JpZCwgb3ZlcmFsbF9hdmVyYWdlX2Fzaywgb3ZlcmFsbF9hdmVyYWdlX3RydWUsIG92ZXJhbGxfYXZlcmFnZV9leHBlY3RlZCkpKSkKbGluZXMob3ZlcmFsbF9hdmVyYWdlX2FzaywgdHlwZSA9ICJsIiwgcGNoID0gMTYsIGNvbCA9ICJyZWQiKQpsaW5lcyhvdmVyYWxsX2F2ZXJhZ2VfdHJ1ZSwgdHlwZSA9ICJsIiwgcGNoID0gMTYsIGNvbCA9ICJncmVlbiIpCmxpbmVzKG92ZXJhbGxfYXZlcmFnZV9leHBlY3RlZCwgdHlwZSA9ICJsIiwgcGNoID0gMTYsIGNvbCA9ICJwdXJwbGUiKQpsZWdlbmQoImJvdHRvbWxlZnQiLCBsZWdlbmQgPSBjKCJCaWRzIiwgIkFza3MiLCAiVHJ1ZSBWYWx1ZSIsICJFeHBlY3RlZCBWYWx1ZSIpLCBjb2wgPSBjKCJibHVlIiwgInJlZCIsICJncmVlbiIsICJwdXJwbGUiKSwgbHR5ID0gMSwgY2V4ID0gMC44KQpgYGAKCgoKYGBge3J9CiMgSW5pdGlhbGl6ZSBtYXRyaWNlcyB0byBzdG9yZSBhdmVyYWdlcyBmb3IgZWFjaCBwb3NpdGlvbgphdmVyYWdlX01NX3BubCA8LSBtYXRyaXgoTkEsIG5yb3cgPSAxMDAsIG5jb2wgPSAxMCkKYXZlcmFnZV9Nb20xX3BubCA8LSBtYXRyaXgoTkEsIG5yb3cgPSAxMDAsIG5jb2wgPSAxMCkKYXZlcmFnZV9Nb20yX3BubCA8LSBtYXRyaXgoTkEsIG5yb3cgPSAxMDAsIG5jb2wgPSAxMCkKYXZlcmFnZV9Nb20zX3BubCA8LSBtYXRyaXgoTkEsIG5yb3cgPSAxMDAsIG5jb2wgPSAxMCkKYXZlcmFnZV9Nb200X3BubCA8LSBtYXRyaXgoTkEsIG5yb3cgPSAxMDAsIG5jb2wgPSAxMCkKYXZlcmFnZV9Nb201X3BubCA8LSBtYXRyaXgoTkEsIG5yb3cgPSAxMDAsIG5jb2wgPSAxMCkKYXZlcmFnZV9Nb202X3BubCA8LSBtYXRyaXgoTkEsIG5yb3cgPSAxMDAsIG5jb2wgPSAxMCkKCiMgTG9vcCB0aHJvdWdoIGVhY2ggc2ltdWxhdGlvbiAobikKZm9yIChuIGluIDE6MTApIHsKCiAgTU1fcG5sX3NldDEwIDwtIHN0cnNwbGl0KGdzdWIoIlxcW3xcXF0iLCAiIiwgdW5saXN0KGFnZ3JlZ2F0ZWRfcmVzdWx0c18xMFtuLCA2XSkpLCAiLCAiKQoKICBNb20xX3BubF9zZXQxMCA8LSBzdHJzcGxpdChnc3ViKCJcXFt8XFxdIiwgIiIsIHVubGlzdChhZ2dyZWdhdGVkX3Jlc3VsdHNfMTBbbiwgOF0pKSwgIiwgIikKICAKICBNb20yX3BubF9zZXQxMCA8LSBzdHJzcGxpdChnc3ViKCJcXFt8XFxdIiwgIiIsIHVubGlzdChhZ2dyZWdhdGVkX3Jlc3VsdHNfMTBbbiwgMTBdKSksICIsICIpCiAgCiAgTW9tM19wbmxfc2V0MTAgPC0gc3Ryc3BsaXQoZ3N1YigiXFxbfFxcXSIsICIiLCB1bmxpc3QoYWdncmVnYXRlZF9yZXN1bHRzXzEwW24sIDEyXSkpLCAiLCAiKQogIAogIE1vbTRfcG5sX3NldDEwIDwtIHN0cnNwbGl0KGdzdWIoIlxcW3xcXF0iLCAiIiwgdW5saXN0KGFnZ3JlZ2F0ZWRfcmVzdWx0c18xMFtuLCAxNF0pKSwgIiwgIikKICAKICBNb201X3BubF9zZXQxMCA8LSBzdHJzcGxpdChnc3ViKCJcXFt8XFxdIiwgIiIsIHVubGlzdChhZ2dyZWdhdGVkX3Jlc3VsdHNfMTBbbiwgMTZdKSksICIsICIpCiAgCiAgTW9tNl9wbmxfc2V0MTAgPC0gc3Ryc3BsaXQoZ3N1YigiXFxbfFxcXSIsICIiLCB1bmxpc3QoYWdncmVnYXRlZF9yZXN1bHRzXzEwW24sIDE4XSkpLCAiLCAiKQogIAogICMgTG9vcCB0aHJvdWdoIGVhY2ggcG9zaXRpb24gKGkpCiAgZm9yIChpIGluIDE6MTAwKSB7CiAgICAjIEV4dHJhY3QgVHJ1ZSBhbmQgRXhwZWN0ZWQgdmFsdWVzIGZvciB0aGUgaS10aCBwb3NpdGlvbgogICAgTU1fcG5sIDwtIHNhcHBseShNTV9wbmxfc2V0MTAsIGZ1bmN0aW9uKHgpIGFzLm51bWVyaWMoeFtpXSkpCiAgICBNb20xX3BubCA8LSBzYXBwbHkoTW9tMV9wbmxfc2V0MTAsIGZ1bmN0aW9uKHgpIGFzLm51bWVyaWMoeFtpXSkpCiAgICBNb20yX3BubCA8LSBzYXBwbHkoTW9tMl9wbmxfc2V0MTAsIGZ1bmN0aW9uKHgpIGFzLm51bWVyaWMoeFtpXSkpCiAgICBNb20zX3BubCA8LSBzYXBwbHkoTW9tM19wbmxfc2V0MTAsIGZ1bmN0aW9uKHgpIGFzLm51bWVyaWMoeFtpXSkpCiAgICBNb200X3BubCA8LSBzYXBwbHkoTW9tNF9wbmxfc2V0MTAsIGZ1bmN0aW9uKHgpIGFzLm51bWVyaWMoeFtpXSkpCiAgICBNb201X3BubCA8LSBzYXBwbHkoTW9tNV9wbmxfc2V0MTAsIGZ1bmN0aW9uKHgpIGFzLm51bWVyaWMoeFtpXSkpCiAgICBNb202X3BubCA8LSBzYXBwbHkoTW9tNl9wbmxfc2V0MTAsIGZ1bmN0aW9uKHgpIGFzLm51bWVyaWMoeFtpXSkpCiAgICAKICAgICMgQ2FsY3VsYXRlIHRoZSBhdmVyYWdlIG9mIFRydWUgYW5kIEV4cGVjdGVkIHZhbHVlcyBmb3IgdGhlIGktdGggcG9zaXRpb24KICAgIGF2ZXJhZ2VfTU1fcG5sW2ksIG5dIDwtIG1lYW4oTU1fcG5sLCBuYS5ybSA9IFRSVUUpCiAgICBhdmVyYWdlX01vbTFfcG5sW2ksIG5dIDwtIG1lYW4oTW9tMV9wbmwsIG5hLnJtID0gVFJVRSkKICAgIGF2ZXJhZ2VfTW9tMl9wbmxbaSwgbl0gPC0gbWVhbihNb20yX3BubCwgbmEucm0gPSBUUlVFKQogICAgYXZlcmFnZV9Nb20zX3BubFtpLCBuXSA8LSBtZWFuKE1vbTNfcG5sLCBuYS5ybSA9IFRSVUUpCiAgICBhdmVyYWdlX01vbTRfcG5sW2ksIG5dIDwtIG1lYW4oTW9tNF9wbmwsIG5hLnJtID0gVFJVRSkKICAgIGF2ZXJhZ2VfTW9tNV9wbmxbaSwgbl0gPC0gbWVhbihNb201X3BubCwgbmEucm0gPSBUUlVFKQogICAgYXZlcmFnZV9Nb202X3BubFtpLCBuXSA8LSBtZWFuKE1vbTZfcG5sLCBuYS5ybSA9IFRSVUUpCiAgfQp9CgojIENhbGN1bGF0ZSB0aGUgb3ZlcmFsbCBhdmVyYWdlIGZvciBlYWNoIHBvc2l0aW9uIGFjcm9zcyBhbGwgc2ltdWxhdGlvbnMKb3ZlcmFsbF9hdmVyYWdlX01NX3BubCA8LSByb3dNZWFucyhhdmVyYWdlX01NX3BubCwgbmEucm0gPSBUUlVFKQpvdmVyYWxsX2F2ZXJhZ2VfTW9tMV9wbmwgPC0gcm93TWVhbnMoYXZlcmFnZV9Nb20xX3BubCwgbmEucm0gPSBUUlVFKQpvdmVyYWxsX2F2ZXJhZ2VfTW9tMl9wbmwgPC0gcm93TWVhbnMoYXZlcmFnZV9Nb20yX3BubCwgbmEucm0gPSBUUlVFKQpvdmVyYWxsX2F2ZXJhZ2VfTW9tM19wbmwgPC0gcm93TWVhbnMoYXZlcmFnZV9Nb20zX3BubCwgbmEucm0gPSBUUlVFKQpvdmVyYWxsX2F2ZXJhZ2VfTW9tNF9wbmwgPC0gcm93TWVhbnMoYXZlcmFnZV9Nb200X3BubCwgbmEucm0gPSBUUlVFKQpvdmVyYWxsX2F2ZXJhZ2VfTW9tNV9wbmwgPC0gcm93TWVhbnMoYXZlcmFnZV9Nb201X3BubCwgbmEucm0gPSBUUlVFKQpvdmVyYWxsX2F2ZXJhZ2VfTW9tNl9wbmwgPC0gcm93TWVhbnMoYXZlcmFnZV9Nb202X3BubCwgbmEucm0gPSBUUlVFKQoKIyBQbG90IHRoZSBvdmVyYWxsIGF2ZXJhZ2VzCnBsb3Qob3ZlcmFsbF9hdmVyYWdlX01NX3BubCwgdHlwZSA9ICJsIiwgcGNoID0gMTYsIGNvbCA9ICJibGFjayIsIG1haW4gPSAiT3ZlcmFsbCBBdmVyYWdlIFBOTCIsIHhsYWIgPSAiUG9zaXRpb24gaW4gTGlzdCIsIHlsYWIgPSAiVmFsdWUiLCB5bGltID0gYyhtaW4oYyhvdmVyYWxsX2F2ZXJhZ2VfTU1fcG5sLCBvdmVyYWxsX2F2ZXJhZ2VfTW9tMV9wbmwsIG92ZXJhbGxfYXZlcmFnZV9Nb20yX3BubCwgb3ZlcmFsbF9hdmVyYWdlX01vbTNfcG5sLCBvdmVyYWxsX2F2ZXJhZ2VfTW9tNF9wbmwsIG92ZXJhbGxfYXZlcmFnZV9Nb201X3BubCwgb3ZlcmFsbF9hdmVyYWdlX01vbTZfcG5sKSksIG1heChjKG92ZXJhbGxfYXZlcmFnZV9NTV9wbmwsIG92ZXJhbGxfYXZlcmFnZV9Nb20xX3BubCwgb3ZlcmFsbF9hdmVyYWdlX01vbTJfcG5sLCBvdmVyYWxsX2F2ZXJhZ2VfTW9tM19wbmwsIG92ZXJhbGxfYXZlcmFnZV9Nb200X3BubCwgb3ZlcmFsbF9hdmVyYWdlX01vbTVfcG5sLCBvdmVyYWxsX2F2ZXJhZ2VfTW9tNl9wbmwpKSkpCmxpbmVzKG92ZXJhbGxfYXZlcmFnZV9Nb20xX3BubCwgdHlwZSA9ICJsIiwgcGNoID0gMTYsIGNvbCA9ICJyZWQiKQpsaW5lcyhvdmVyYWxsX2F2ZXJhZ2VfTW9tMl9wbmwsIHR5cGUgPSAibCIsIHBjaCA9IDE2LCBjb2wgPSAiZ3JlZW4iKQpsaW5lcyhvdmVyYWxsX2F2ZXJhZ2VfTW9tM19wbmwsIHR5cGUgPSAibCIsIHBjaCA9IDE2LCBjb2wgPSAieWVsbG93IikKbGluZXMob3ZlcmFsbF9hdmVyYWdlX01vbTRfcG5sLCB0eXBlID0gImwiLCBwY2ggPSAxNiwgY29sID0gImJsdWUiKQpsaW5lcyhvdmVyYWxsX2F2ZXJhZ2VfTW9tNV9wbmwsIHR5cGUgPSAibCIsIHBjaCA9IDE2LCBjb2wgPSAicHVycGxlIikKbGluZXMob3ZlcmFsbF9hdmVyYWdlX01vbTZfcG5sLCB0eXBlID0gImwiLCBwY2ggPSAxNiwgY29sID0gIm9yYW5nZSIpCgojIEFkZCBsZWdlbmQKbGVnZW5kKCJ0b3BsZWZ0IiwgbGVnZW5kID0gYygiTWFya2V0IE1ha2VyIiwgIkluZm9ybWVkIiwgIk1vbTEiLCAiTW9tMiIsICJNb20zIiwgIk1vbTQiLCAiTW9tNSIpLCBjb2wgPSBjKCJibGFjayIsICJyZWQiLCAiZ3JlZW4iLCAieWVsbG93IiwgImJsdWUiLCAicHVycGxlIiwgIm9yYW5nZSIpLCBsdHkgPSAxLCBjZXggPSAwLjgpCmBgYAoKYGBge3J9CiMgSW5pdGlhbGl6ZSBtYXRyaWNlcyB0byBzdG9yZSBhdmVyYWdlcyBmb3IgZWFjaCBwb3NpdGlvbgphdmVyYWdlX01NX3BvcyA8LSBtYXRyaXgoTkEsIG5yb3cgPSAxMDAsIG5jb2wgPSAxMCkKYXZlcmFnZV9Nb20xX3BvcyA8LSBtYXRyaXgoTkEsIG5yb3cgPSAxMDAsIG5jb2wgPSAxMCkKYXZlcmFnZV9Nb20yX3BvcyA8LSBtYXRyaXgoTkEsIG5yb3cgPSAxMDAsIG5jb2wgPSAxMCkKYXZlcmFnZV9Nb20zX3BvcyA8LSBtYXRyaXgoTkEsIG5yb3cgPSAxMDAsIG5jb2wgPSAxMCkKYXZlcmFnZV9Nb200X3BvcyA8LSBtYXRyaXgoTkEsIG5yb3cgPSAxMDAsIG5jb2wgPSAxMCkKYXZlcmFnZV9Nb201X3BvcyA8LSBtYXRyaXgoTkEsIG5yb3cgPSAxMDAsIG5jb2wgPSAxMCkKYXZlcmFnZV9Nb202X3BvcyA8LSBtYXRyaXgoTkEsIG5yb3cgPSAxMDAsIG5jb2wgPSAxMCkKCiMgTG9vcCB0aHJvdWdoIGVhY2ggc2ltdWxhdGlvbiAobikKZm9yIChuIGluIDE6MTApIHsKCiAgTU1fcG9zX3NldDEwIDwtIHN0cnNwbGl0KGdzdWIoIlxcW3xcXF0iLCAiIiwgdW5saXN0KGFnZ3JlZ2F0ZWRfcmVzdWx0c18xMFtuLCA3XSkpLCAiLCAiKQoKICBNb20xX3Bvc19zZXQxMCA8LSBzdHJzcGxpdChnc3ViKCJcXFt8XFxdIiwgIiIsIHVubGlzdChhZ2dyZWdhdGVkX3Jlc3VsdHNfMTBbbiwgOV0pKSwgIiwgIikKICAKICBNb20yX3Bvc19zZXQxMCA8LSBzdHJzcGxpdChnc3ViKCJcXFt8XFxdIiwgIiIsIHVubGlzdChhZ2dyZWdhdGVkX3Jlc3VsdHNfMTBbbiwgMTFdKSksICIsICIpCiAgCiAgTW9tM19wb3Nfc2V0MTAgPC0gc3Ryc3BsaXQoZ3N1YigiXFxbfFxcXSIsICIiLCB1bmxpc3QoYWdncmVnYXRlZF9yZXN1bHRzXzEwW24sIDEzXSkpLCAiLCAiKQogIAogIE1vbTRfcG9zX3NldDEwIDwtIHN0cnNwbGl0KGdzdWIoIlxcW3xcXF0iLCAiIiwgdW5saXN0KGFnZ3JlZ2F0ZWRfcmVzdWx0c18xMFtuLCAxNV0pKSwgIiwgIikKICAKICBNb201X3Bvc19zZXQxMCA8LSBzdHJzcGxpdChnc3ViKCJcXFt8XFxdIiwgIiIsIHVubGlzdChhZ2dyZWdhdGVkX3Jlc3VsdHNfMTBbbiwgMTddKSksICIsICIpCiAgCiAgTW9tNl9wb3Nfc2V0MTAgPC0gc3Ryc3BsaXQoZ3N1YigiXFxbfFxcXSIsICIiLCB1bmxpc3QoYWdncmVnYXRlZF9yZXN1bHRzXzEwW24sIDE5XSkpLCAiLCAiKQogIAogICMgTG9vcCB0aHJvdWdoIGVhY2ggcG9zaXRpb24gKGkpCiAgZm9yIChpIGluIDE6MTAwKSB7CiAgICAjIEV4dHJhY3QgVHJ1ZSBhbmQgRXhwZWN0ZWQgdmFsdWVzIGZvciB0aGUgaS10aCBwb3NpdGlvbgogICAgTU1fcG9zIDwtIHNhcHBseShNTV9wb3Nfc2V0MTAsIGZ1bmN0aW9uKHgpIGFzLm51bWVyaWMoeFtpXSkpCiAgICBNb20xX3BvcyA8LSBzYXBwbHkoTW9tMV9wb3Nfc2V0MTAsIGZ1bmN0aW9uKHgpIGFzLm51bWVyaWMoeFtpXSkpCiAgICBNb20yX3BvcyA8LSBzYXBwbHkoTW9tMl9wb3Nfc2V0MTAsIGZ1bmN0aW9uKHgpIGFzLm51bWVyaWMoeFtpXSkpCiAgICBNb20zX3BvcyA8LSBzYXBwbHkoTW9tM19wb3Nfc2V0MTAsIGZ1bmN0aW9uKHgpIGFzLm51bWVyaWMoeFtpXSkpCiAgICBNb200X3BvcyA8LSBzYXBwbHkoTW9tNF9wb3Nfc2V0MTAsIGZ1bmN0aW9uKHgpIGFzLm51bWVyaWMoeFtpXSkpCiAgICBNb201X3BvcyA8LSBzYXBwbHkoTW9tNV9wb3Nfc2V0MTAsIGZ1bmN0aW9uKHgpIGFzLm51bWVyaWMoeFtpXSkpCiAgICBNb202X3BvcyA8LSBzYXBwbHkoTW9tNl9wb3Nfc2V0MTAsIGZ1bmN0aW9uKHgpIGFzLm51bWVyaWMoeFtpXSkpCiAgICAKICAgICMgQ2FsY3VsYXRlIHRoZSBhdmVyYWdlIG9mIFRydWUgYW5kIEV4cGVjdGVkIHZhbHVlcyBmb3IgdGhlIGktdGggcG9zaXRpb24KICAgIGF2ZXJhZ2VfTU1fcG9zW2ksIG5dIDwtIG1lYW4oTU1fcG9zLCBuYS5ybSA9IFRSVUUpCiAgICBhdmVyYWdlX01vbTFfcG9zW2ksIG5dIDwtIG1lYW4oTW9tMV9wb3MsIG5hLnJtID0gVFJVRSkKICAgIGF2ZXJhZ2VfTW9tMl9wb3NbaSwgbl0gPC0gbWVhbihNb20yX3BvcywgbmEucm0gPSBUUlVFKQogICAgYXZlcmFnZV9Nb20zX3Bvc1tpLCBuXSA8LSBtZWFuKE1vbTNfcG9zLCBuYS5ybSA9IFRSVUUpCiAgICBhdmVyYWdlX01vbTRfcG9zW2ksIG5dIDwtIG1lYW4oTW9tNF9wb3MsIG5hLnJtID0gVFJVRSkKICAgIGF2ZXJhZ2VfTW9tNV9wb3NbaSwgbl0gPC0gbWVhbihNb201X3BvcywgbmEucm0gPSBUUlVFKQogICAgYXZlcmFnZV9Nb202X3Bvc1tpLCBuXSA8LSBtZWFuKE1vbTZfcG9zLCBuYS5ybSA9IFRSVUUpCiAgfQp9CgojIENhbGN1bGF0ZSB0aGUgb3ZlcmFsbCBhdmVyYWdlIGZvciBlYWNoIHBvc2l0aW9uIGFjcm9zcyBhbGwgc2ltdWxhdGlvbnMKb3ZlcmFsbF9hdmVyYWdlX01NX3BvcyA8LSByb3dNZWFucyhhdmVyYWdlX01NX3BvcywgbmEucm0gPSBUUlVFKQpvdmVyYWxsX2F2ZXJhZ2VfTW9tMV9wb3MgPC0gcm93TWVhbnMoYXZlcmFnZV9Nb20xX3BvcywgbmEucm0gPSBUUlVFKQpvdmVyYWxsX2F2ZXJhZ2VfTW9tMl9wb3MgPC0gcm93TWVhbnMoYXZlcmFnZV9Nb20yX3BvcywgbmEucm0gPSBUUlVFKQpvdmVyYWxsX2F2ZXJhZ2VfTW9tM19wb3MgPC0gcm93TWVhbnMoYXZlcmFnZV9Nb20zX3BvcywgbmEucm0gPSBUUlVFKQpvdmVyYWxsX2F2ZXJhZ2VfTW9tNF9wb3MgPC0gcm93TWVhbnMoYXZlcmFnZV9Nb200X3BvcywgbmEucm0gPSBUUlVFKQpvdmVyYWxsX2F2ZXJhZ2VfTW9tNV9wb3MgPC0gcm93TWVhbnMoYXZlcmFnZV9Nb201X3BvcywgbmEucm0gPSBUUlVFKQpvdmVyYWxsX2F2ZXJhZ2VfTW9tNl9wb3MgPC0gcm93TWVhbnMoYXZlcmFnZV9Nb202X3BvcywgbmEucm0gPSBUUlVFKQoKIyBQbG90IHRoZSBvdmVyYWxsIGF2ZXJhZ2VzCnBsb3Qob3ZlcmFsbF9hdmVyYWdlX01NX3BvcywgdHlwZSA9ICJsIiwgcGNoID0gMTYsIGNvbCA9ICJibGFjayIsIG1haW4gPSAiT3ZlcmFsbCBBdmVyYWdlIFBvc2l0aW9uIiwgeGxhYiA9ICJQb3NpdGlvbiBpbiBMaXN0IiwgeWxhYiA9ICJWYWx1ZSIsIHlsaW0gPSBjKG1pbihjKG92ZXJhbGxfYXZlcmFnZV9NTV9wb3MsIG92ZXJhbGxfYXZlcmFnZV9Nb20xX3Bvcywgb3ZlcmFsbF9hdmVyYWdlX01vbTJfcG9zLCBvdmVyYWxsX2F2ZXJhZ2VfTW9tM19wb3MsIG92ZXJhbGxfYXZlcmFnZV9Nb200X3Bvcywgb3ZlcmFsbF9hdmVyYWdlX01vbTVfcG9zLCBvdmVyYWxsX2F2ZXJhZ2VfTW9tNl9wb3MpKSwgbWF4KGMob3ZlcmFsbF9hdmVyYWdlX01NX3Bvcywgb3ZlcmFsbF9hdmVyYWdlX01vbTFfcG9zLCBvdmVyYWxsX2F2ZXJhZ2VfTW9tMl9wb3MsIG92ZXJhbGxfYXZlcmFnZV9Nb20zX3Bvcywgb3ZlcmFsbF9hdmVyYWdlX01vbTRfcG9zLCBvdmVyYWxsX2F2ZXJhZ2VfTW9tNV9wb3MsIG92ZXJhbGxfYXZlcmFnZV9Nb202X3BvcykpKSkKbGluZXMob3ZlcmFsbF9hdmVyYWdlX01vbTFfcG9zLCB0eXBlID0gImwiLCBwY2ggPSAxNiwgY29sID0gInJlZCIpCmxpbmVzKG92ZXJhbGxfYXZlcmFnZV9Nb20yX3BvcywgdHlwZSA9ICJsIiwgcGNoID0gMTYsIGNvbCA9ICJncmVlbiIpCmxpbmVzKG92ZXJhbGxfYXZlcmFnZV9Nb20zX3BvcywgdHlwZSA9ICJsIiwgcGNoID0gMTYsIGNvbCA9ICJ5ZWxsb3ciKQpsaW5lcyhvdmVyYWxsX2F2ZXJhZ2VfTW9tNF9wb3MsIHR5cGUgPSAibCIsIHBjaCA9IDE2LCBjb2wgPSAiYmx1ZSIpCmxpbmVzKG92ZXJhbGxfYXZlcmFnZV9Nb201X3BvcywgdHlwZSA9ICJsIiwgcGNoID0gMTYsIGNvbCA9ICJwdXJwbGUiKQpsaW5lcyhvdmVyYWxsX2F2ZXJhZ2VfTW9tNl9wb3MsIHR5cGUgPSAibCIsIHBjaCA9IDE2LCBjb2wgPSAib3JhbmdlIikKCiMgQWRkIGxlZ2VuZApsZWdlbmQoInRvcGxlZnQiLCBsZWdlbmQgPSBjKCJNYXJrZXQgTWFrZXIiLCAiTW9tMSIsICJNb20yIiwgIk1vbTMiLCAiTW9tNCIsICJNb201IiwgIk1vbTYiKSwgY29sID0gYygiYmxhY2siLCAicmVkIiwgImdyZWVuIiwgInllbGxvdyIsICJibHVlIiwgInB1cnBsZSIsICJvcmFuZ2UiKSwgbHR5ID0gMSwgY2V4ID0gMC44KQpgYGAKCgojIyBzZXQxMSAoMiBpbmZvcm1lZCArIDIgbm9pc3kgaW5mb3JtZWQgKyAyIG5vaXN5KQoKYGBge3J9CiMgSW5pdGlhbGl6ZSBtYXRyaWNlcyB0byBzdG9yZSBhdmVyYWdlcyBmb3IgZWFjaCBwb3NpdGlvbgphdmVyYWdlX2JpZCA8LSBtYXRyaXgoTkEsIG5yb3cgPSAxMDAsIG5jb2wgPSAxMCkKYXZlcmFnZV9hc2sgPC0gbWF0cml4KE5BLCBucm93ID0gMTAwLCBuY29sID0gMTApCgojIExvb3AgdGhyb3VnaCBlYWNoIHNpbXVsYXRpb24gKG4pCmZvciAobiBpbiAxOjEwKSB7CiAgIyBFeHRyYWN0IFRydWUgdmFsdWVzIGZyb20gdGhlIGFnZ3JlZ2F0ZWRfcmVzdWx0c180IGRhdGFmcmFtZQogIEJpZHNfc2V0MTEgPC0gc3Ryc3BsaXQoZ3N1YigiXFxbfFxcXSIsICIiLCB1bmxpc3QoYWdncmVnYXRlZF9yZXN1bHRzXzExW24sIDRdKSksICIsICIpCiAgCiAgIyBFeHRyYWN0IEV4cGVjdGVkIHZhbHVlcyBmcm9tIHRoZSBhZ2dyZWdhdGVkX3Jlc3VsdHNfNCBkYXRhZnJhbWUKICBBc2tzX3NldDExIDwtIHN0cnNwbGl0KGdzdWIoIlxcW3xcXF0iLCAiIiwgdW5saXN0KGFnZ3JlZ2F0ZWRfcmVzdWx0c18xMVtuLCA1XSkpLCAiLCAiKQogIAogICMgTG9vcCB0aHJvdWdoIGVhY2ggcG9zaXRpb24gKGkpCiAgZm9yIChpIGluIDE6MTAwKSB7CiAgICAjIEV4dHJhY3QgVHJ1ZSBhbmQgRXhwZWN0ZWQgdmFsdWVzIGZvciB0aGUgaS10aCBwb3NpdGlvbgogICAgQmlkcyA8LSBzYXBwbHkoQmlkc19zZXQxMSwgZnVuY3Rpb24oeCkgYXMubnVtZXJpYyh4W2ldKSkKICAgIEFza3MgPC0gc2FwcGx5KEFza3Nfc2V0MTEsIGZ1bmN0aW9uKHgpIGFzLm51bWVyaWMoeFtpXSkpCiAgICAKICAgICMgQ2FsY3VsYXRlIHRoZSBhdmVyYWdlIG9mIFRydWUgYW5kIEV4cGVjdGVkIHZhbHVlcyBmb3IgdGhlIGktdGggcG9zaXRpb24KICAgIGF2ZXJhZ2VfYmlkW2ksIG5dIDwtIG1lYW4oQmlkcywgbmEucm0gPSBUUlVFKQogICAgYXZlcmFnZV9hc2tbaSwgbl0gPC0gbWVhbihBc2tzLCBuYS5ybSA9IFRSVUUpCiAgfQp9CgojIENhbGN1bGF0ZSB0aGUgb3ZlcmFsbCBhdmVyYWdlIGZvciBlYWNoIHBvc2l0aW9uIGFjcm9zcyBhbGwgc2ltdWxhdGlvbnMKb3ZlcmFsbF9hdmVyYWdlX2JpZCA8LSByb3dNZWFucyhhdmVyYWdlX2JpZCwgbmEucm0gPSBUUlVFKQpvdmVyYWxsX2F2ZXJhZ2VfYXNrIDwtIHJvd01lYW5zKGF2ZXJhZ2VfYXNrLCBuYS5ybSA9IFRSVUUpCgojIyBUcnVlIFZhbHVlCiMgSW5pdGlhbGl6ZSBtYXRyaWNlcyB0byBzdG9yZSBhdmVyYWdlcyBmb3IgZWFjaCBwb3NpdGlvbgphdmVyYWdlX3RydWUgPC0gbWF0cml4KE5BLCBucm93ID0gMTAwLCBuY29sID0gMTApCmF2ZXJhZ2VfZXhwZWN0ZWQgPC0gbWF0cml4KE5BLCBucm93ID0gMTAwLCBuY29sID0gMTApCgojIExvb3AgdGhyb3VnaCBlYWNoIHNpbXVsYXRpb24gKG4pCmZvciAobiBpbiAxOjEwKSB7CiAgIyBFeHRyYWN0IFRydWUgdmFsdWVzIGZyb20gdGhlIGFnZ3JlZ2F0ZWRfcmVzdWx0c180IGRhdGFmcmFtZQogIFRydWVWYWx1ZXNfc2V0MTEgPC0gc3Ryc3BsaXQoZ3N1YigiXFxbfFxcXSIsICIiLCB1bmxpc3QoYWdncmVnYXRlZF9yZXN1bHRzXzExW24sIDJdKSksICIsICIpCiAgCiAgIyBFeHRyYWN0IEV4cGVjdGVkIHZhbHVlcyBmcm9tIHRoZSBhZ2dyZWdhdGVkX3Jlc3VsdHNfNCBkYXRhZnJhbWUKICBFeHBlY3RlZFZhbHVlc19zZXQxMSA8LSBzdHJzcGxpdChnc3ViKCJcXFt8XFxdIiwgIiIsIHVubGlzdChhZ2dyZWdhdGVkX3Jlc3VsdHNfMTFbbiwgM10pKSwgIiwgIikKICAKICAjIExvb3AgdGhyb3VnaCBlYWNoIHBvc2l0aW9uIChpKQogIGZvciAoaSBpbiAxOjEwMCkgewogICAgIyBFeHRyYWN0IFRydWUgYW5kIEV4cGVjdGVkIHZhbHVlcyBmb3IgdGhlIGktdGggcG9zaXRpb24KICAgIFRydWVfdmFsdWVzIDwtIHNhcHBseShUcnVlVmFsdWVzX3NldDExLCBmdW5jdGlvbih4KSBhcy5udW1lcmljKHhbaV0pKQogICAgRXhwZWN0ZWRfdmFsdWVzIDwtIHNhcHBseShFeHBlY3RlZFZhbHVlc19zZXQxMSwgZnVuY3Rpb24oeCkgYXMubnVtZXJpYyh4W2ldKSkKICAgIAogICAgIyBDYWxjdWxhdGUgdGhlIGF2ZXJhZ2Ugb2YgVHJ1ZSBhbmQgRXhwZWN0ZWQgdmFsdWVzIGZvciB0aGUgaS10aCBwb3NpdGlvbgogICAgYXZlcmFnZV90cnVlW2ksIG5dIDwtIG1lYW4oVHJ1ZV92YWx1ZXMsIG5hLnJtID0gVFJVRSkKICAgIGF2ZXJhZ2VfZXhwZWN0ZWRbaSwgbl0gPC0gbWVhbihFeHBlY3RlZF92YWx1ZXMsIG5hLnJtID0gVFJVRSkKICB9Cn0KCiMgQ2FsY3VsYXRlIHRoZSBvdmVyYWxsIGF2ZXJhZ2UgZm9yIGVhY2ggcG9zaXRpb24gYWNyb3NzIGFsbCBzaW11bGF0aW9ucwpvdmVyYWxsX2F2ZXJhZ2VfdHJ1ZSA8LSByb3dNZWFucyhhdmVyYWdlX3RydWUsIG5hLnJtID0gVFJVRSkKb3ZlcmFsbF9hdmVyYWdlX2V4cGVjdGVkIDwtIHJvd01lYW5zKGF2ZXJhZ2VfZXhwZWN0ZWQsIG5hLnJtID0gVFJVRSkKCiMgUGxvdCB0aGUgb3ZlcmFsbCBhdmVyYWdlcwojcGxvdChvdmVyYWxsX2F2ZXJhZ2VfdHJ1ZSwgdHlwZSA9ICJsIiwgcGNoID0gMTYsIGNvbCA9ICJibHVlIiwgbWFpbiA9ICJPdmVyYWxsIEF2ZXJhZ2Ugb2YgVHJ1ZSB2cyBFeHBlY3RlZCBWYWx1ZXMiLCB4bGFiID0gIlBvc2l0aW9uIGluIExpc3QiLCB5bGFiID0gIlZhbHVlIiwgeWxpbSA9IGMobWluKGMob3ZlcmFsbF9hdmVyYWdlX3RydWUsIG92ZXJhbGxfYXZlcmFnZV9leHBlY3RlZCkpLCBtYXgoYyhvdmVyYWxsX2F2ZXJhZ2VfdHJ1ZSwgb3ZlcmFsbF9hdmVyYWdlX2V4cGVjdGVkKSkpKQojbGluZXMob3ZlcmFsbF9hdmVyYWdlX2V4cGVjdGVkLCB0eXBlID0gImwiLCBwY2ggPSAxNiwgY29sID0gInJlZCIpCiNsZWdlbmQoInRvcHJpZ2h0IiwgbGVnZW5kID0gYygiVHJ1ZSBWYWx1ZXMiLCAiRXhwZWN0ZWQgVmFsdWVzIiksIGNvbCA9IGMoImJsdWUiLCAicmVkIiksIGx0eSA9IDEsIGNleCA9IDAuOCkKCiMgUGxvdCB0aGUgb3ZlcmFsbCBhdmVyYWdlcwpwbG90KG92ZXJhbGxfYXZlcmFnZV9iaWQsIHR5cGUgPSAibCIsIHBjaCA9IDE2LCBjb2wgPSAiYmx1ZSIsIG1haW4gPSAiT3ZlcmFsbCBBdmVyYWdlIG9mIEJpZHMgdnMgQXNrcyAmIFRydWUgdnMgRXhwZWN0ZWQgVmFsdWVzIiwgeGxhYiA9ICJQb3NpdGlvbiBpbiBMaXN0IiwgeWxhYiA9ICJWYWx1ZSIsIHlsaW0gPSBjKG1pbihjKG92ZXJhbGxfYXZlcmFnZV9iaWQsIG92ZXJhbGxfYXZlcmFnZV9hc2ssIG92ZXJhbGxfYXZlcmFnZV90cnVlLCBvdmVyYWxsX2F2ZXJhZ2VfZXhwZWN0ZWQpKSwgbWF4KGMob3ZlcmFsbF9hdmVyYWdlX2JpZCwgb3ZlcmFsbF9hdmVyYWdlX2Fzaywgb3ZlcmFsbF9hdmVyYWdlX3RydWUsIG92ZXJhbGxfYXZlcmFnZV9leHBlY3RlZCkpKSkKbGluZXMob3ZlcmFsbF9hdmVyYWdlX2FzaywgdHlwZSA9ICJsIiwgcGNoID0gMTYsIGNvbCA9ICJyZWQiKQpsaW5lcyhvdmVyYWxsX2F2ZXJhZ2VfdHJ1ZSwgdHlwZSA9ICJsIiwgcGNoID0gMTYsIGNvbCA9ICJncmVlbiIpCmxpbmVzKG92ZXJhbGxfYXZlcmFnZV9leHBlY3RlZCwgdHlwZSA9ICJsIiwgcGNoID0gMTYsIGNvbCA9ICJwdXJwbGUiKQpsZWdlbmQoImJvdHRvbWxlZnQiLCBsZWdlbmQgPSBjKCJCaWRzIiwgIkFza3MiLCAiVHJ1ZSBWYWx1ZSIsICJFeHBlY3RlZCBWYWx1ZSIpLCBjb2wgPSBjKCJibHVlIiwgInJlZCIsICJncmVlbiIsICJwdXJwbGUiKSwgbHR5ID0gMSwgY2V4ID0gMC44KQpgYGAKCmBgYHtyfQojIEluaXRpYWxpemUgbWF0cmljZXMgdG8gc3RvcmUgYXZlcmFnZXMgZm9yIGVhY2ggcG9zaXRpb24KYXZlcmFnZV9NTV9wbmwgPC0gbWF0cml4KE5BLCBucm93ID0gMTAwLCBuY29sID0gMTApCmF2ZXJhZ2VfSW5mb3JtZWQxX3BubCA8LSBtYXRyaXgoTkEsIG5yb3cgPSAxMDAsIG5jb2wgPSAxMCkKYXZlcmFnZV9JbmZvcm1lZDJfcG5sIDwtIG1hdHJpeChOQSwgbnJvdyA9IDEwMCwgbmNvbCA9IDEwKQphdmVyYWdlX05vaXN5SW5mb3JtZWQxX3BubCA8LSBtYXRyaXgoTkEsIG5yb3cgPSAxMDAsIG5jb2wgPSAxMCkKYXZlcmFnZV9Ob2lzeUluZm9ybWVkMl9wbmwgPC0gbWF0cml4KE5BLCBucm93ID0gMTAwLCBuY29sID0gMTApCmF2ZXJhZ2VfTm9pc3kxX3BubCA8LSBtYXRyaXgoTkEsIG5yb3cgPSAxMDAsIG5jb2wgPSAxMCkKYXZlcmFnZV9Ob2lzeTJfcG5sIDwtIG1hdHJpeChOQSwgbnJvdyA9IDEwMCwgbmNvbCA9IDEwKQoKIyBMb29wIHRocm91Z2ggZWFjaCBzaW11bGF0aW9uIChuKQpmb3IgKG4gaW4gMToxMCkgewoKICBNTV9wbmxfc2V0MTEgPC0gc3Ryc3BsaXQoZ3N1YigiXFxbfFxcXSIsICIiLCB1bmxpc3QoYWdncmVnYXRlZF9yZXN1bHRzXzExW24sIDZdKSksICIsICIpCgogIEluZm9ybWVkMV9wbmxfc2V0MTEgPC0gc3Ryc3BsaXQoZ3N1YigiXFxbfFxcXSIsICIiLCB1bmxpc3QoYWdncmVnYXRlZF9yZXN1bHRzXzExW24sIDhdKSksICIsICIpCiAgCiAgSW5mb3JtZWQyX3BubF9zZXQxMSA8LSBzdHJzcGxpdChnc3ViKCJcXFt8XFxdIiwgIiIsIHVubGlzdChhZ2dyZWdhdGVkX3Jlc3VsdHNfMTFbbiwgMTBdKSksICIsICIpCiAgCiAgTm9pc3lJbmZvcm1lZDFfcG5sX3NldDExIDwtIHN0cnNwbGl0KGdzdWIoIlxcW3xcXF0iLCAiIiwgdW5saXN0KGFnZ3JlZ2F0ZWRfcmVzdWx0c18xMVtuLCAxMl0pKSwgIiwgIikKICAKICBOb2lzeUluZm9ybWVkMl9wbmxfc2V0MTEgPC0gc3Ryc3BsaXQoZ3N1YigiXFxbfFxcXSIsICIiLCB1bmxpc3QoYWdncmVnYXRlZF9yZXN1bHRzXzExW24sIDE0XSkpLCAiLCAiKQogIAogIE5vaXN5MV9wbmxfc2V0MTEgPC0gc3Ryc3BsaXQoZ3N1YigiXFxbfFxcXSIsICIiLCB1bmxpc3QoYWdncmVnYXRlZF9yZXN1bHRzXzExW24sIDE2XSkpLCAiLCAiKQogIAogIE5vaXN5Ml9wbmxfc2V0MTEgPC0gc3Ryc3BsaXQoZ3N1YigiXFxbfFxcXSIsICIiLCB1bmxpc3QoYWdncmVnYXRlZF9yZXN1bHRzXzExW24sIDE4XSkpLCAiLCAiKQogIAogICMgTG9vcCB0aHJvdWdoIGVhY2ggcG9zaXRpb24gKGkpCiAgZm9yIChpIGluIDE6MTAwKSB7CiAgICAjIEV4dHJhY3QgVHJ1ZSBhbmQgRXhwZWN0ZWQgdmFsdWVzIGZvciB0aGUgaS10aCBwb3NpdGlvbgogICAgTU1fcG5sIDwtIHNhcHBseShNTV9wbmxfc2V0MTEsIGZ1bmN0aW9uKHgpIGFzLm51bWVyaWMoeFtpXSkpCiAgICBJbmZvcm1lZDFfcG5sIDwtIHNhcHBseShJbmZvcm1lZDFfcG5sX3NldDExLCBmdW5jdGlvbih4KSBhcy5udW1lcmljKHhbaV0pKQogICAgSW5mb3JtZWQyX3BubCA8LSBzYXBwbHkoSW5mb3JtZWQyX3BubF9zZXQxMSwgZnVuY3Rpb24oeCkgYXMubnVtZXJpYyh4W2ldKSkKICAgIE5vaXN5SW5mb3JtZWQxX3BubCA8LSBzYXBwbHkoTm9pc3lJbmZvcm1lZDFfcG5sX3NldDExLCBmdW5jdGlvbih4KSBhcy5udW1lcmljKHhbaV0pKQogICAgTm9pc3lJbmZvcm1lZDFfcG5sIDwtIHNhcHBseShOb2lzeUluZm9ybWVkMl9wbmxfc2V0MTEsIGZ1bmN0aW9uKHgpIGFzLm51bWVyaWMoeFtpXSkpCiAgICBOb2lzeTFfcG5sIDwtIHNhcHBseShOb2lzeTFfcG5sX3NldDExLCBmdW5jdGlvbih4KSBhcy5udW1lcmljKHhbaV0pKQogICAgTm9pc3kyX3BubCA8LSBzYXBwbHkoTm9pc3kyX3BubF9zZXQxMSwgZnVuY3Rpb24oeCkgYXMubnVtZXJpYyh4W2ldKSkKICAgIAogICAgIyBDYWxjdWxhdGUgdGhlIGF2ZXJhZ2Ugb2YgVHJ1ZSBhbmQgRXhwZWN0ZWQgdmFsdWVzIGZvciB0aGUgaS10aCBwb3NpdGlvbgogICAgYXZlcmFnZV9NTV9wbmxbaSwgbl0gPC0gbWVhbihNTV9wbmwsIG5hLnJtID0gVFJVRSkKICAgIGF2ZXJhZ2VfSW5mb3JtZWQxX3BubFtpLCBuXSA8LSBtZWFuKEluZm9ybWVkMV9wbmwsIG5hLnJtID0gVFJVRSkKICAgIGF2ZXJhZ2VfSW5mb3JtZWQyX3BubFtpLCBuXSA8LSBtZWFuKEluZm9ybWVkMl9wbmwsIG5hLnJtID0gVFJVRSkKICAgIGF2ZXJhZ2VfTm9pc3lJbmZvcm1lZDFfcG5sW2ksIG5dIDwtIG1lYW4oTm9pc3lJbmZvcm1lZDFfcG5sLCBuYS5ybSA9IFRSVUUpCiAgICBhdmVyYWdlX05vaXN5SW5mb3JtZWQyX3BubFtpLCBuXSA8LSBtZWFuKE5vaXN5SW5mb3JtZWQyX3BubCwgbmEucm0gPSBUUlVFKQogICAgYXZlcmFnZV9Ob2lzeTFfcG5sW2ksIG5dIDwtIG1lYW4oTm9pc3kxX3BubCwgbmEucm0gPSBUUlVFKQogICAgYXZlcmFnZV9Ob2lzeTJfcG5sW2ksIG5dIDwtIG1lYW4oTm9pc3kyX3BubCwgbmEucm0gPSBUUlVFKQogIH0KfQoKIyBDYWxjdWxhdGUgdGhlIG92ZXJhbGwgYXZlcmFnZSBmb3IgZWFjaCBwb3NpdGlvbiBhY3Jvc3MgYWxsIHNpbXVsYXRpb25zCm92ZXJhbGxfYXZlcmFnZV9NTV9wbmwgPC0gcm93TWVhbnMoYXZlcmFnZV9NTV9wbmwsIG5hLnJtID0gVFJVRSkKb3ZlcmFsbF9hdmVyYWdlX0luZm9ybWVkMV9wbmwgPC0gcm93TWVhbnMoYXZlcmFnZV9JbmZvcm1lZDFfcG5sLCBuYS5ybSA9IFRSVUUpCm92ZXJhbGxfYXZlcmFnZV9JbmZvcm1lZDJfcG5sIDwtIHJvd01lYW5zKGF2ZXJhZ2VfSW5mb3JtZWQyX3BubCwgbmEucm0gPSBUUlVFKQpvdmVyYWxsX2F2ZXJhZ2VfTm9pc3lJbmZvcm1lZDFfcG5sIDwtIHJvd01lYW5zKGF2ZXJhZ2VfTm9pc3lJbmZvcm1lZDFfcG5sLCBuYS5ybSA9IFRSVUUpCm92ZXJhbGxfYXZlcmFnZV9Ob2lzeUluZm9ybWVkMl9wbmwgPC0gcm93TWVhbnMoYXZlcmFnZV9Ob2lzeUluZm9ybWVkMl9wbmwsIG5hLnJtID0gVFJVRSkKb3ZlcmFsbF9hdmVyYWdlX05vaXN5MV9wbmwgPC0gcm93TWVhbnMoYXZlcmFnZV9Ob2lzeTFfcG5sLCBuYS5ybSA9IFRSVUUpCm92ZXJhbGxfYXZlcmFnZV9Ob2lzeTJfcG5sIDwtIHJvd01lYW5zKGF2ZXJhZ2VfTm9pc3kyX3BubCwgbmEucm0gPSBUUlVFKQoKIyBQbG90IHRoZSBvdmVyYWxsIGF2ZXJhZ2VzCnBsb3Qob3ZlcmFsbF9hdmVyYWdlX01NX3BubCwgdHlwZSA9ICJsIiwgcGNoID0gMTYsIGNvbCA9ICJibGFjayIsIG1haW4gPSAiT3ZlcmFsbCBBdmVyYWdlIFBOTCIsIHhsYWIgPSAiUG9zaXRpb24gaW4gTGlzdCIsIHlsYWIgPSAiVmFsdWUiLCB5bGltID0gYyhtaW4oYyhvdmVyYWxsX2F2ZXJhZ2VfTU1fcG5sLCBvdmVyYWxsX2F2ZXJhZ2VfSW5mb3JtZWQxX3BubCwgb3ZlcmFsbF9hdmVyYWdlX0luZm9ybWVkMl9wbmwsIG92ZXJhbGxfYXZlcmFnZV9Ob2lzeUluZm9ybWVkMV9wbmwsIG92ZXJhbGxfYXZlcmFnZV9Ob2lzeUluZm9ybWVkMl9wbmwsIG92ZXJhbGxfYXZlcmFnZV9Ob2lzeTFfcG5sLCBvdmVyYWxsX2F2ZXJhZ2VfTm9pc3kyX3BubCkpLCBtYXgoYyhvdmVyYWxsX2F2ZXJhZ2VfTU1fcG5sLCBvdmVyYWxsX2F2ZXJhZ2VfSW5mb3JtZWQxX3BubCwgb3ZlcmFsbF9hdmVyYWdlX0luZm9ybWVkMl9wbmwsIG92ZXJhbGxfYXZlcmFnZV9Ob2lzeUluZm9ybWVkMV9wbmwsIG92ZXJhbGxfYXZlcmFnZV9Ob2lzeUluZm9ybWVkMl9wbmwsIG92ZXJhbGxfYXZlcmFnZV9Ob2lzeTFfcG5sLCBvdmVyYWxsX2F2ZXJhZ2VfTm9pc3kyX3BubCkpKSkKbGluZXMob3ZlcmFsbF9hdmVyYWdlX0luZm9ybWVkMV9wbmwsIHR5cGUgPSAibCIsIHBjaCA9IDE2LCBjb2wgPSAicmVkIikKbGluZXMob3ZlcmFsbF9hdmVyYWdlX0luZm9ybWVkMl9wbmwsIHR5cGUgPSAibCIsIHBjaCA9IDE2LCBjb2wgPSAiZ3JlZW4iKQpsaW5lcyhvdmVyYWxsX2F2ZXJhZ2VfTm9pc3lJbmZvcm1lZDFfcG5sLCB0eXBlID0gImwiLCBwY2ggPSAxNiwgY29sID0gInllbGxvdyIpCmxpbmVzKG92ZXJhbGxfYXZlcmFnZV9Ob2lzeUluZm9ybWVkMl9wbmwsIHR5cGUgPSAibCIsIHBjaCA9IDE2LCBjb2wgPSAiYmx1ZSIpCmxpbmVzKG92ZXJhbGxfYXZlcmFnZV9Ob2lzeTFfcG5sLCB0eXBlID0gImwiLCBwY2ggPSAxNiwgY29sID0gInB1cnBsZSIpCmxpbmVzKG92ZXJhbGxfYXZlcmFnZV9Ob2lzeTJfcG5sLCB0eXBlID0gImwiLCBwY2ggPSAxNiwgY29sID0gIm9yYW5nZSIpCgojIEFkZCBsZWdlbmQKbGVnZW5kKCJib3R0b21sZWZ0IiwgbGVnZW5kID0gYygiTWFya2V0IE1ha2VyIiwgIkluZm9ybWVkIDEiLCAiSW5mb3JtZWQgMiIsICJOb2lzeSBJbmZvcm1lZCAxIiwgIk5vaXN5IEluZm9ybWVkIDIiLCAiTm9pc3kgMSIsICJOb2lzeSAyIiksIGNvbCA9IGMoImJsYWNrIiwgInJlZCIsICJncmVlbiIsICJ5ZWxsb3ciLCAiYmx1ZSIsICJwdXJwbGUiLCAib3JhbmdlIiksIGx0eSA9IDEsIGNleCA9IDAuOCkKYGBgCgpgYGB7cn0KIyBJbml0aWFsaXplIG1hdHJpY2VzIHRvIHN0b3JlIGF2ZXJhZ2VzIGZvciBlYWNoIHBvc2l0aW9uCmF2ZXJhZ2VfTU1fcG9zIDwtIG1hdHJpeChOQSwgbnJvdyA9IDEwMCwgbmNvbCA9IDEwKQphdmVyYWdlX0luZm9ybWVkMV9wb3MgPC0gbWF0cml4KE5BLCBucm93ID0gMTAwLCBuY29sID0gMTApCmF2ZXJhZ2VfSW5mb3JtZWQyX3BvcyA8LSBtYXRyaXgoTkEsIG5yb3cgPSAxMDAsIG5jb2wgPSAxMCkKYXZlcmFnZV9Ob2lzeUluZm9ybWVkMV9wb3MgPC0gbWF0cml4KE5BLCBucm93ID0gMTAwLCBuY29sID0gMTApCmF2ZXJhZ2VfTm9pc3lJbmZvcm1lZDJfcG9zIDwtIG1hdHJpeChOQSwgbnJvdyA9IDEwMCwgbmNvbCA9IDEwKQphdmVyYWdlX05vaXN5MV9wb3MgPC0gbWF0cml4KE5BLCBucm93ID0gMTAwLCBuY29sID0gMTApCmF2ZXJhZ2VfTm9pc3kyX3BvcyA8LSBtYXRyaXgoTkEsIG5yb3cgPSAxMDAsIG5jb2wgPSAxMCkKCiMgTG9vcCB0aHJvdWdoIGVhY2ggc2ltdWxhdGlvbiAobikKZm9yIChuIGluIDE6MTApIHsKCiAgTU1fcG9zX3NldDExIDwtIHN0cnNwbGl0KGdzdWIoIlxcW3xcXF0iLCAiIiwgdW5saXN0KGFnZ3JlZ2F0ZWRfcmVzdWx0c18xMVtuLCA3XSkpLCAiLCAiKQoKICBJbmZvcm1lZDFfcG9zX3NldDExIDwtIHN0cnNwbGl0KGdzdWIoIlxcW3xcXF0iLCAiIiwgdW5saXN0KGFnZ3JlZ2F0ZWRfcmVzdWx0c18xMVtuLCA5XSkpLCAiLCAiKQogIAogIEluZm9ybWVkMl9wb3Nfc2V0MTEgPC0gc3Ryc3BsaXQoZ3N1YigiXFxbfFxcXSIsICIiLCB1bmxpc3QoYWdncmVnYXRlZF9yZXN1bHRzXzExW24sIDExXSkpLCAiLCAiKQogIAogIE5vaXN5SW5mb3JtZWQxX3Bvc19zZXQxMSA8LSBzdHJzcGxpdChnc3ViKCJcXFt8XFxdIiwgIiIsIHVubGlzdChhZ2dyZWdhdGVkX3Jlc3VsdHNfMTFbbiwgMTNdKSksICIsICIpCiAgCiAgTm9pc3lJbmZvcm1lZDJfcG9zX3NldDExIDwtIHN0cnNwbGl0KGdzdWIoIlxcW3xcXF0iLCAiIiwgdW5saXN0KGFnZ3JlZ2F0ZWRfcmVzdWx0c18xMVtuLCAxNV0pKSwgIiwgIikKICAKICBOb2lzeTFfcG9zX3NldDExIDwtIHN0cnNwbGl0KGdzdWIoIlxcW3xcXF0iLCAiIiwgdW5saXN0KGFnZ3JlZ2F0ZWRfcmVzdWx0c18xMVtuLCAxN10pKSwgIiwgIikKICAKICBOb2lzeTJfcG9zX3NldDExIDwtIHN0cnNwbGl0KGdzdWIoIlxcW3xcXF0iLCAiIiwgdW5saXN0KGFnZ3JlZ2F0ZWRfcmVzdWx0c18xMVtuLCAxOV0pKSwgIiwgIikKICAKICAjIExvb3AgdGhyb3VnaCBlYWNoIHBvc2l0aW9uIChpKQogIGZvciAoaSBpbiAxOjEwMCkgewogICAgIyBFeHRyYWN0IFRydWUgYW5kIEV4cGVjdGVkIHZhbHVlcyBmb3IgdGhlIGktdGggcG9zaXRpb24KICAgIE1NX3BvcyA8LSBzYXBwbHkoTU1fcG5sX3NldDExLCBmdW5jdGlvbih4KSBhcy5udW1lcmljKHhbaV0pKQogICAgSW5mb3JtZWQxX3BvcyA8LSBzYXBwbHkoSW5mb3JtZWQxX3Bvc19zZXQxMSwgZnVuY3Rpb24oeCkgYXMubnVtZXJpYyh4W2ldKSkKICAgIEluZm9ybWVkMl9wb3MgPC0gc2FwcGx5KEluZm9ybWVkMl9wb3Nfc2V0MTEsIGZ1bmN0aW9uKHgpIGFzLm51bWVyaWMoeFtpXSkpCiAgICBOb2lzeUluZm9ybWVkMV9wb3MgPC0gc2FwcGx5KE5vaXN5SW5mb3JtZWQxX3Bvc19zZXQxMSwgZnVuY3Rpb24oeCkgYXMubnVtZXJpYyh4W2ldKSkKICAgIE5vaXN5SW5mb3JtZWQxX3BvcyA8LSBzYXBwbHkoTm9pc3lJbmZvcm1lZDJfcG9zX3NldDExLCBmdW5jdGlvbih4KSBhcy5udW1lcmljKHhbaV0pKQogICAgTm9pc3kxX3BvcyA8LSBzYXBwbHkoTm9pc3kxX3Bvc19zZXQxMSwgZnVuY3Rpb24oeCkgYXMubnVtZXJpYyh4W2ldKSkKICAgIE5vaXN5Ml9wb3MgPC0gc2FwcGx5KE5vaXN5Ml9wb3Nfc2V0MTEsIGZ1bmN0aW9uKHgpIGFzLm51bWVyaWMoeFtpXSkpCiAgICAKICAgICMgQ2FsY3VsYXRlIHRoZSBhdmVyYWdlIG9mIFRydWUgYW5kIEV4cGVjdGVkIHZhbHVlcyBmb3IgdGhlIGktdGggcG9zaXRpb24KICAgIGF2ZXJhZ2VfTU1fcG9zW2ksIG5dIDwtIG1lYW4oTU1fcG9zLCBuYS5ybSA9IFRSVUUpCiAgICBhdmVyYWdlX0luZm9ybWVkMV9wb3NbaSwgbl0gPC0gbWVhbihJbmZvcm1lZDFfcG9zLCBuYS5ybSA9IFRSVUUpCiAgICBhdmVyYWdlX0luZm9ybWVkMl9wb3NbaSwgbl0gPC0gbWVhbihJbmZvcm1lZDJfcG9zLCBuYS5ybSA9IFRSVUUpCiAgICBhdmVyYWdlX05vaXN5SW5mb3JtZWQxX3Bvc1tpLCBuXSA8LSBtZWFuKE5vaXN5SW5mb3JtZWQxX3BvcywgbmEucm0gPSBUUlVFKQogICAgYXZlcmFnZV9Ob2lzeUluZm9ybWVkMl9wb3NbaSwgbl0gPC0gbWVhbihOb2lzeUluZm9ybWVkMl9wb3MsIG5hLnJtID0gVFJVRSkKICAgIGF2ZXJhZ2VfTm9pc3kxX3Bvc1tpLCBuXSA8LSBtZWFuKE5vaXN5MV9wb3MsIG5hLnJtID0gVFJVRSkKICAgIGF2ZXJhZ2VfTm9pc3kyX3Bvc1tpLCBuXSA8LSBtZWFuKE5vaXN5Ml9wb3MsIG5hLnJtID0gVFJVRSkKICB9Cn0KCiMgQ2FsY3VsYXRlIHRoZSBvdmVyYWxsIGF2ZXJhZ2UgZm9yIGVhY2ggcG9zaXRpb24gYWNyb3NzIGFsbCBzaW11bGF0aW9ucwpvdmVyYWxsX2F2ZXJhZ2VfTU1fcG9zIDwtIHJvd01lYW5zKGF2ZXJhZ2VfTU1fcG9zLCBuYS5ybSA9IFRSVUUpCm92ZXJhbGxfYXZlcmFnZV9JbmZvcm1lZDFfcG9zIDwtIHJvd01lYW5zKGF2ZXJhZ2VfSW5mb3JtZWQxX3BvcywgbmEucm0gPSBUUlVFKQpvdmVyYWxsX2F2ZXJhZ2VfSW5mb3JtZWQyX3BvcyA8LSByb3dNZWFucyhhdmVyYWdlX0luZm9ybWVkMl9wb3MsIG5hLnJtID0gVFJVRSkKb3ZlcmFsbF9hdmVyYWdlX05vaXN5SW5mb3JtZWQxX3BvcyA8LSByb3dNZWFucyhhdmVyYWdlX05vaXN5SW5mb3JtZWQxX3BvcywgbmEucm0gPSBUUlVFKQpvdmVyYWxsX2F2ZXJhZ2VfTm9pc3lJbmZvcm1lZDJfcG9zIDwtIHJvd01lYW5zKGF2ZXJhZ2VfTm9pc3lJbmZvcm1lZDJfcG9zLCBuYS5ybSA9IFRSVUUpCm92ZXJhbGxfYXZlcmFnZV9Ob2lzeTFfcG9zIDwtIHJvd01lYW5zKGF2ZXJhZ2VfTm9pc3kxX3BvcywgbmEucm0gPSBUUlVFKQpvdmVyYWxsX2F2ZXJhZ2VfTm9pc3kyX3BvcyA8LSByb3dNZWFucyhhdmVyYWdlX05vaXN5Ml9wb3MsIG5hLnJtID0gVFJVRSkKCiMgUGxvdCB0aGUgb3ZlcmFsbCBhdmVyYWdlcwpwbG90KG92ZXJhbGxfYXZlcmFnZV9NTV9wb3MsIHR5cGUgPSAibCIsIHBjaCA9IDE2LCBjb2wgPSAiYmxhY2siLCBtYWluID0gIk92ZXJhbGwgQXZlcmFnZSBQb3NpdGlvbiIsIHhsYWIgPSAiUG9zaXRpb24gaW4gTGlzdCIsIHlsYWIgPSAiVmFsdWUiLCB5bGltID0gYyhtaW4oYyhvdmVyYWxsX2F2ZXJhZ2VfTU1fcG9zLCBvdmVyYWxsX2F2ZXJhZ2VfSW5mb3JtZWQxX3Bvcywgb3ZlcmFsbF9hdmVyYWdlX0luZm9ybWVkMl9wb3MsIG92ZXJhbGxfYXZlcmFnZV9Ob2lzeUluZm9ybWVkMV9wb3MsIG92ZXJhbGxfYXZlcmFnZV9Ob2lzeUluZm9ybWVkMl9wb3MsIG92ZXJhbGxfYXZlcmFnZV9Ob2lzeTFfcG9zLCBvdmVyYWxsX2F2ZXJhZ2VfTm9pc3kyX3BvcykpLCBtYXgoYyhvdmVyYWxsX2F2ZXJhZ2VfTU1fcG9zLCBvdmVyYWxsX2F2ZXJhZ2VfSW5mb3JtZWQxX3Bvcywgb3ZlcmFsbF9hdmVyYWdlX0luZm9ybWVkMl9wb3MsIG92ZXJhbGxfYXZlcmFnZV9Ob2lzeUluZm9ybWVkMV9wb3MsIG92ZXJhbGxfYXZlcmFnZV9Ob2lzeUluZm9ybWVkMl9wb3MsIG92ZXJhbGxfYXZlcmFnZV9Ob2lzeTFfcG9zLCBvdmVyYWxsX2F2ZXJhZ2VfTm9pc3kyX3BvcykpKSkKbGluZXMob3ZlcmFsbF9hdmVyYWdlX0luZm9ybWVkMV9wb3MsIHR5cGUgPSAibCIsIHBjaCA9IDE2LCBjb2wgPSAicmVkIikKbGluZXMob3ZlcmFsbF9hdmVyYWdlX0luZm9ybWVkMl9wb3MsIHR5cGUgPSAibCIsIHBjaCA9IDE2LCBjb2wgPSAiZ3JlZW4iKQpsaW5lcyhvdmVyYWxsX2F2ZXJhZ2VfTm9pc3lJbmZvcm1lZDFfcG9zLCB0eXBlID0gImwiLCBwY2ggPSAxNiwgY29sID0gInllbGxvdyIpCmxpbmVzKG92ZXJhbGxfYXZlcmFnZV9Ob2lzeUluZm9ybWVkMl9wb3MsIHR5cGUgPSAibCIsIHBjaCA9IDE2LCBjb2wgPSAiYmx1ZSIpCmxpbmVzKG92ZXJhbGxfYXZlcmFnZV9Ob2lzeTFfcG9zLCB0eXBlID0gImwiLCBwY2ggPSAxNiwgY29sID0gInB1cnBsZSIpCmxpbmVzKG92ZXJhbGxfYXZlcmFnZV9Ob2lzeTJfcG9zLCB0eXBlID0gImwiLCBwY2ggPSAxNiwgY29sID0gIm9yYW5nZSIpCgojIEFkZCBsZWdlbmQKbGVnZW5kKCJib3R0b21sZWZ0IiwgbGVnZW5kID0gYygiTWFya2V0IE1ha2VyIiwgIkluZm9ybWVkIDEiLCAiSW5mb3JtZWQgMiIsICJOb2lzeSBJbmZvcm1lZCAxIiwgIk5vaXN5IEluZm9ybWVkIDIiLCAiTm9pc3kgMSIsICJOb2lzeSAyIiksIGNvbCA9IGMoImJsYWNrIiwgInJlZCIsICJncmVlbiIsICJ5ZWxsb3ciLCAiYmx1ZSIsICJwdXJwbGUiLCAib3JhbmdlIiksIGx0eSA9IDEsIGNleCA9IDAuOCkKYGBgCgoKCiMjIHNldDEyICg2IFN0b2NoYXN0aWMgTm9pc3kpCgpgYGB7cn0KIyBJbml0aWFsaXplIG1hdHJpY2VzIHRvIHN0b3JlIGF2ZXJhZ2VzIGZvciBlYWNoIHBvc2l0aW9uCmF2ZXJhZ2VfYmlkIDwtIG1hdHJpeChOQSwgbnJvdyA9IDEwMCwgbmNvbCA9IDEwKQphdmVyYWdlX2FzayA8LSBtYXRyaXgoTkEsIG5yb3cgPSAxMDAsIG5jb2wgPSAxMCkKCiMgTG9vcCB0aHJvdWdoIGVhY2ggc2ltdWxhdGlvbiAobikKZm9yIChuIGluIDE6MTApIHsKICAjIEV4dHJhY3QgVHJ1ZSB2YWx1ZXMgZnJvbSB0aGUgYWdncmVnYXRlZF9yZXN1bHRzXzQgZGF0YWZyYW1lCiAgQmlkc19zZXQxMiA8LSBzdHJzcGxpdChnc3ViKCJcXFt8XFxdIiwgIiIsIHVubGlzdChhZ2dyZWdhdGVkX3Jlc3VsdHNfMTJbbiwgNF0pKSwgIiwgIikKICAKICAjIEV4dHJhY3QgRXhwZWN0ZWQgdmFsdWVzIGZyb20gdGhlIGFnZ3JlZ2F0ZWRfcmVzdWx0c180IGRhdGFmcmFtZQogIEFza3Nfc2V0MTIgPC0gc3Ryc3BsaXQoZ3N1YigiXFxbfFxcXSIsICIiLCB1bmxpc3QoYWdncmVnYXRlZF9yZXN1bHRzXzEyW24sIDVdKSksICIsICIpCiAgCiAgIyBMb29wIHRocm91Z2ggZWFjaCBwb3NpdGlvbiAoaSkKICBmb3IgKGkgaW4gMToxMDApIHsKICAgICMgRXh0cmFjdCBUcnVlIGFuZCBFeHBlY3RlZCB2YWx1ZXMgZm9yIHRoZSBpLXRoIHBvc2l0aW9uCiAgICBCaWRzIDwtIHNhcHBseShCaWRzX3NldDEyLCBmdW5jdGlvbih4KSBhcy5udW1lcmljKHhbaV0pKQogICAgQXNrcyA8LSBzYXBwbHkoQXNrc19zZXQxMiwgZnVuY3Rpb24oeCkgYXMubnVtZXJpYyh4W2ldKSkKICAgIAogICAgIyBDYWxjdWxhdGUgdGhlIGF2ZXJhZ2Ugb2YgVHJ1ZSBhbmQgRXhwZWN0ZWQgdmFsdWVzIGZvciB0aGUgaS10aCBwb3NpdGlvbgogICAgYXZlcmFnZV9iaWRbaSwgbl0gPC0gbWVhbihCaWRzLCBuYS5ybSA9IFRSVUUpCiAgICBhdmVyYWdlX2Fza1tpLCBuXSA8LSBtZWFuKEFza3MsIG5hLnJtID0gVFJVRSkKICB9Cn0KCiMgQ2FsY3VsYXRlIHRoZSBvdmVyYWxsIGF2ZXJhZ2UgZm9yIGVhY2ggcG9zaXRpb24gYWNyb3NzIGFsbCBzaW11bGF0aW9ucwpvdmVyYWxsX2F2ZXJhZ2VfYmlkIDwtIHJvd01lYW5zKGF2ZXJhZ2VfYmlkLCBuYS5ybSA9IFRSVUUpCm92ZXJhbGxfYXZlcmFnZV9hc2sgPC0gcm93TWVhbnMoYXZlcmFnZV9hc2ssIG5hLnJtID0gVFJVRSkKCiMjIFRydWUgVmFsdWUKIyBJbml0aWFsaXplIG1hdHJpY2VzIHRvIHN0b3JlIGF2ZXJhZ2VzIGZvciBlYWNoIHBvc2l0aW9uCmF2ZXJhZ2VfdHJ1ZSA8LSBtYXRyaXgoTkEsIG5yb3cgPSAxMDAsIG5jb2wgPSAxMCkKYXZlcmFnZV9leHBlY3RlZCA8LSBtYXRyaXgoTkEsIG5yb3cgPSAxMDAsIG5jb2wgPSAxMCkKCiMgTG9vcCB0aHJvdWdoIGVhY2ggc2ltdWxhdGlvbiAobikKZm9yIChuIGluIDE6MTApIHsKICAjIEV4dHJhY3QgVHJ1ZSB2YWx1ZXMgZnJvbSB0aGUgYWdncmVnYXRlZF9yZXN1bHRzXzQgZGF0YWZyYW1lCiAgVHJ1ZVZhbHVlc19zZXQxMiA8LSBzdHJzcGxpdChnc3ViKCJcXFt8XFxdIiwgIiIsIHVubGlzdChhZ2dyZWdhdGVkX3Jlc3VsdHNfMTJbbiwgMl0pKSwgIiwgIikKICAKICAjIEV4dHJhY3QgRXhwZWN0ZWQgdmFsdWVzIGZyb20gdGhlIGFnZ3JlZ2F0ZWRfcmVzdWx0c180IGRhdGFmcmFtZQogIEV4cGVjdGVkVmFsdWVzX3NldDEyIDwtIHN0cnNwbGl0KGdzdWIoIlxcW3xcXF0iLCAiIiwgdW5saXN0KGFnZ3JlZ2F0ZWRfcmVzdWx0c18xMltuLCAzXSkpLCAiLCAiKQogIAogICMgTG9vcCB0aHJvdWdoIGVhY2ggcG9zaXRpb24gKGkpCiAgZm9yIChpIGluIDE6MTAwKSB7CiAgICAjIEV4dHJhY3QgVHJ1ZSBhbmQgRXhwZWN0ZWQgdmFsdWVzIGZvciB0aGUgaS10aCBwb3NpdGlvbgogICAgVHJ1ZV92YWx1ZXMgPC0gc2FwcGx5KFRydWVWYWx1ZXNfc2V0MTIsIGZ1bmN0aW9uKHgpIGFzLm51bWVyaWMoeFtpXSkpCiAgICBFeHBlY3RlZF92YWx1ZXMgPC0gc2FwcGx5KEV4cGVjdGVkVmFsdWVzX3NldDEyLCBmdW5jdGlvbih4KSBhcy5udW1lcmljKHhbaV0pKQogICAgCiAgICAjIENhbGN1bGF0ZSB0aGUgYXZlcmFnZSBvZiBUcnVlIGFuZCBFeHBlY3RlZCB2YWx1ZXMgZm9yIHRoZSBpLXRoIHBvc2l0aW9uCiAgICBhdmVyYWdlX3RydWVbaSwgbl0gPC0gbWVhbihUcnVlX3ZhbHVlcywgbmEucm0gPSBUUlVFKQogICAgYXZlcmFnZV9leHBlY3RlZFtpLCBuXSA8LSBtZWFuKEV4cGVjdGVkX3ZhbHVlcywgbmEucm0gPSBUUlVFKQogIH0KfQoKIyBDYWxjdWxhdGUgdGhlIG92ZXJhbGwgYXZlcmFnZSBmb3IgZWFjaCBwb3NpdGlvbiBhY3Jvc3MgYWxsIHNpbXVsYXRpb25zCm92ZXJhbGxfYXZlcmFnZV90cnVlIDwtIHJvd01lYW5zKGF2ZXJhZ2VfdHJ1ZSwgbmEucm0gPSBUUlVFKQpvdmVyYWxsX2F2ZXJhZ2VfZXhwZWN0ZWQgPC0gcm93TWVhbnMoYXZlcmFnZV9leHBlY3RlZCwgbmEucm0gPSBUUlVFKQoKIyBQbG90IHRoZSBvdmVyYWxsIGF2ZXJhZ2VzCiNwbG90KG92ZXJhbGxfYXZlcmFnZV90cnVlLCB0eXBlID0gImwiLCBwY2ggPSAxNiwgY29sID0gImJsdWUiLCBtYWluID0gIk92ZXJhbGwgQXZlcmFnZSBvZiBUcnVlIHZzIEV4cGVjdGVkIFZhbHVlcyIsIHhsYWIgPSAiUG9zaXRpb24gaW4gTGlzdCIsIHlsYWIgPSAiVmFsdWUiLCB5bGltID0gYyhtaW4oYyhvdmVyYWxsX2F2ZXJhZ2VfdHJ1ZSwgb3ZlcmFsbF9hdmVyYWdlX2V4cGVjdGVkKSksIG1heChjKG92ZXJhbGxfYXZlcmFnZV90cnVlLCBvdmVyYWxsX2F2ZXJhZ2VfZXhwZWN0ZWQpKSkpCiNsaW5lcyhvdmVyYWxsX2F2ZXJhZ2VfZXhwZWN0ZWQsIHR5cGUgPSAibCIsIHBjaCA9IDE2LCBjb2wgPSAicmVkIikKI2xlZ2VuZCgidG9wcmlnaHQiLCBsZWdlbmQgPSBjKCJUcnVlIFZhbHVlcyIsICJFeHBlY3RlZCBWYWx1ZXMiKSwgY29sID0gYygiYmx1ZSIsICJyZWQiKSwgbHR5ID0gMSwgY2V4ID0gMC44KQoKIyBQbG90IHRoZSBvdmVyYWxsIGF2ZXJhZ2VzCnBsb3Qob3ZlcmFsbF9hdmVyYWdlX2JpZCwgdHlwZSA9ICJsIiwgcGNoID0gMTYsIGNvbCA9ICJibHVlIiwgbWFpbiA9ICJPdmVyYWxsIEF2ZXJhZ2Ugb2YgQmlkcyB2cyBBc2tzICYgVHJ1ZSB2cyBFeHBlY3RlZCBWYWx1ZXMiLCB4bGFiID0gIlBvc2l0aW9uIGluIExpc3QiLCB5bGFiID0gIlZhbHVlIiwgeWxpbSA9IGMobWluKGMob3ZlcmFsbF9hdmVyYWdlX2JpZCwgb3ZlcmFsbF9hdmVyYWdlX2Fzaywgb3ZlcmFsbF9hdmVyYWdlX3RydWUsIG92ZXJhbGxfYXZlcmFnZV9leHBlY3RlZCkpLCBtYXgoYyhvdmVyYWxsX2F2ZXJhZ2VfYmlkLCBvdmVyYWxsX2F2ZXJhZ2VfYXNrLCBvdmVyYWxsX2F2ZXJhZ2VfdHJ1ZSwgb3ZlcmFsbF9hdmVyYWdlX2V4cGVjdGVkKSkpKQpsaW5lcyhvdmVyYWxsX2F2ZXJhZ2VfYXNrLCB0eXBlID0gImwiLCBwY2ggPSAxNiwgY29sID0gInJlZCIpCmxpbmVzKG92ZXJhbGxfYXZlcmFnZV90cnVlLCB0eXBlID0gImwiLCBwY2ggPSAxNiwgY29sID0gImdyZWVuIikKbGluZXMob3ZlcmFsbF9hdmVyYWdlX2V4cGVjdGVkLCB0eXBlID0gImwiLCBwY2ggPSAxNiwgY29sID0gInB1cnBsZSIpCmxlZ2VuZCgiYm90dG9tbGVmdCIsIGxlZ2VuZCA9IGMoIkJpZHMiLCAiQXNrcyIsICJUcnVlIFZhbHVlIiwgIkV4cGVjdGVkIFZhbHVlIiksIGNvbCA9IGMoImJsdWUiLCAicmVkIiwgImdyZWVuIiwgInB1cnBsZSIpLCBsdHkgPSAxLCBjZXggPSAwLjgpCmBgYAoKYGBge3J9CiMgSW5pdGlhbGl6ZSBtYXRyaWNlcyB0byBzdG9yZSBhdmVyYWdlcyBmb3IgZWFjaCBwb3NpdGlvbgphdmVyYWdlX01NX3BubCA8LSBtYXRyaXgoTkEsIG5yb3cgPSAxMDAsIG5jb2wgPSAxMCkKYXZlcmFnZV9TdG9jaE5vaXN5MV9wbmwgPC0gbWF0cml4KE5BLCBucm93ID0gMTAwLCBuY29sID0gMTApCmF2ZXJhZ2VfU3RvY2hOb2lzeTJfcG5sIDwtIG1hdHJpeChOQSwgbnJvdyA9IDEwMCwgbmNvbCA9IDEwKQphdmVyYWdlX1N0b2NoTm9pc3kzX3BubCA8LSBtYXRyaXgoTkEsIG5yb3cgPSAxMDAsIG5jb2wgPSAxMCkKYXZlcmFnZV9TdG9jaE5vaXN5NF9wbmwgPC0gbWF0cml4KE5BLCBucm93ID0gMTAwLCBuY29sID0gMTApCmF2ZXJhZ2VfU3RvY2hOb2lzeTVfcG5sIDwtIG1hdHJpeChOQSwgbnJvdyA9IDEwMCwgbmNvbCA9IDEwKQphdmVyYWdlX1N0b2NoTm9pc3k2X3BubCA8LSBtYXRyaXgoTkEsIG5yb3cgPSAxMDAsIG5jb2wgPSAxMCkKCiMgTG9vcCB0aHJvdWdoIGVhY2ggc2ltdWxhdGlvbiAobikKZm9yIChuIGluIDE6MTApIHsKCiAgTU1fcG5sX3NldDEyIDwtIHN0cnNwbGl0KGdzdWIoIlxcW3xcXF0iLCAiIiwgdW5saXN0KGFnZ3JlZ2F0ZWRfcmVzdWx0c18xMltuLCA2XSkpLCAiLCAiKQoKICBTdG9jaE5vaXN5MV9wbmxfc2V0MTIgPC0gc3Ryc3BsaXQoZ3N1YigiXFxbfFxcXSIsICIiLCB1bmxpc3QoYWdncmVnYXRlZF9yZXN1bHRzXzEyW24sIDhdKSksICIsICIpCiAgCiAgU3RvY2hOb2lzeTJfcG5sX3NldDEyIDwtIHN0cnNwbGl0KGdzdWIoIlxcW3xcXF0iLCAiIiwgdW5saXN0KGFnZ3JlZ2F0ZWRfcmVzdWx0c18xMltuLCAxMF0pKSwgIiwgIikKICAKICBTdG9jaE5vaXN5M19wbmxfc2V0MTIgPC0gc3Ryc3BsaXQoZ3N1YigiXFxbfFxcXSIsICIiLCB1bmxpc3QoYWdncmVnYXRlZF9yZXN1bHRzXzEyW24sIDEyXSkpLCAiLCAiKQogIAogIFN0b2NoTm9pc3k0X3BubF9zZXQxMiA8LSBzdHJzcGxpdChnc3ViKCJcXFt8XFxdIiwgIiIsIHVubGlzdChhZ2dyZWdhdGVkX3Jlc3VsdHNfMTJbbiwgMTRdKSksICIsICIpCiAgCiAgU3RvY2hOb2lzeTVfcG5sX3NldDEyIDwtIHN0cnNwbGl0KGdzdWIoIlxcW3xcXF0iLCAiIiwgdW5saXN0KGFnZ3JlZ2F0ZWRfcmVzdWx0c18xMltuLCAxNl0pKSwgIiwgIikKICAKICBTdG9jaE5vaXN5Nl9wbmxfc2V0MTIgPC0gc3Ryc3BsaXQoZ3N1YigiXFxbfFxcXSIsICIiLCB1bmxpc3QoYWdncmVnYXRlZF9yZXN1bHRzXzEyW24sIDE4XSkpLCAiLCAiKQogIAogICMgTG9vcCB0aHJvdWdoIGVhY2ggcG9zaXRpb24gKGkpCiAgZm9yIChpIGluIDE6MTAwKSB7CiAgICAjIEV4dHJhY3QgVHJ1ZSBhbmQgRXhwZWN0ZWQgdmFsdWVzIGZvciB0aGUgaS10aCBwb3NpdGlvbgogICAgTU1fcG5sIDwtIHNhcHBseShNTV9wbmxfc2V0MTIsIGZ1bmN0aW9uKHgpIGFzLm51bWVyaWMoeFtpXSkpCiAgICBTdG9jaE5vaXN5MV9wbmwgPC0gc2FwcGx5KFN0b2NoTm9pc3kxX3BubF9zZXQxMiwgZnVuY3Rpb24oeCkgYXMubnVtZXJpYyh4W2ldKSkKICAgIFN0b2NoTm9pc3kyX3BubCA8LSBzYXBwbHkoU3RvY2hOb2lzeTJfcG5sX3NldDEyLCBmdW5jdGlvbih4KSBhcy5udW1lcmljKHhbaV0pKQogICAgU3RvY2hOb2lzeTNfcG5sIDwtIHNhcHBseShTdG9jaE5vaXN5M19wbmxfc2V0MTIsIGZ1bmN0aW9uKHgpIGFzLm51bWVyaWMoeFtpXSkpCiAgICBTdG9jaE5vaXN5NF9wbmwgPC0gc2FwcGx5KFN0b2NoTm9pc3k0X3BubF9zZXQxMiwgZnVuY3Rpb24oeCkgYXMubnVtZXJpYyh4W2ldKSkKICAgIFN0b2NoTm9pc3k1X3BubCA8LSBzYXBwbHkoU3RvY2hOb2lzeTVfcG5sX3NldDEyLCBmdW5jdGlvbih4KSBhcy5udW1lcmljKHhbaV0pKQogICAgU3RvY2hOb2lzeTZfcG5sIDwtIHNhcHBseShTdG9jaE5vaXN5Nl9wbmxfc2V0MTIsIGZ1bmN0aW9uKHgpIGFzLm51bWVyaWMoeFtpXSkpCiAgICAKICAgICMgQ2FsY3VsYXRlIHRoZSBhdmVyYWdlIG9mIFRydWUgYW5kIEV4cGVjdGVkIHZhbHVlcyBmb3IgdGhlIGktdGggcG9zaXRpb24KICAgIGF2ZXJhZ2VfTU1fcG5sW2ksIG5dIDwtIG1lYW4oTU1fcG5sLCBuYS5ybSA9IFRSVUUpCiAgICBhdmVyYWdlX1N0b2NoTm9pc3kxX3BubFtpLCBuXSA8LSBtZWFuKFN0b2NoTm9pc3kxX3BubCwgbmEucm0gPSBUUlVFKQogICAgYXZlcmFnZV9TdG9jaE5vaXN5Ml9wbmxbaSwgbl0gPC0gbWVhbihTdG9jaE5vaXN5Ml9wbmwsIG5hLnJtID0gVFJVRSkKICAgIGF2ZXJhZ2VfU3RvY2hOb2lzeTNfcG5sW2ksIG5dIDwtIG1lYW4oU3RvY2hOb2lzeTNfcG5sLCBuYS5ybSA9IFRSVUUpCiAgICBhdmVyYWdlX1N0b2NoTm9pc3k0X3BubFtpLCBuXSA8LSBtZWFuKFN0b2NoTm9pc3k0X3BubCwgbmEucm0gPSBUUlVFKQogICAgYXZlcmFnZV9TdG9jaE5vaXN5NV9wbmxbaSwgbl0gPC0gbWVhbihTdG9jaE5vaXN5NV9wbmwsIG5hLnJtID0gVFJVRSkKICAgIGF2ZXJhZ2VfU3RvY2hOb2lzeTZfcG5sW2ksIG5dIDwtIG1lYW4oU3RvY2hOb2lzeTZfcG5sLCBuYS5ybSA9IFRSVUUpCiAgfQp9CgojIENhbGN1bGF0ZSB0aGUgb3ZlcmFsbCBhdmVyYWdlIGZvciBlYWNoIHBvc2l0aW9uIGFjcm9zcyBhbGwgc2ltdWxhdGlvbnMKb3ZlcmFsbF9hdmVyYWdlX01NX3BubCA8LSByb3dNZWFucyhhdmVyYWdlX01NX3BubCwgbmEucm0gPSBUUlVFKQpvdmVyYWxsX2F2ZXJhZ2VfU3RvY2hOb2lzeTFfcG5sIDwtIHJvd01lYW5zKGF2ZXJhZ2VfU3RvY2hOb2lzeTFfcG5sLCBuYS5ybSA9IFRSVUUpCm92ZXJhbGxfYXZlcmFnZV9TdG9jaE5vaXN5Ml9wbmwgPC0gcm93TWVhbnMoYXZlcmFnZV9TdG9jaE5vaXN5Ml9wbmwsIG5hLnJtID0gVFJVRSkKb3ZlcmFsbF9hdmVyYWdlX1N0b2NoTm9pc3kzX3BubCA8LSByb3dNZWFucyhhdmVyYWdlX1N0b2NoTm9pc3kzX3BubCwgbmEucm0gPSBUUlVFKQpvdmVyYWxsX2F2ZXJhZ2VfU3RvY2hOb2lzeTRfcG5sIDwtIHJvd01lYW5zKGF2ZXJhZ2VfU3RvY2hOb2lzeTRfcG5sLCBuYS5ybSA9IFRSVUUpCm92ZXJhbGxfYXZlcmFnZV9TdG9jaE5vaXN5NV9wbmwgPC0gcm93TWVhbnMoYXZlcmFnZV9TdG9jaE5vaXN5NV9wbmwsIG5hLnJtID0gVFJVRSkKb3ZlcmFsbF9hdmVyYWdlX1N0b2NoTm9pc3k2X3BubCA8LSByb3dNZWFucyhhdmVyYWdlX1N0b2NoTm9pc3k2X3BubCwgbmEucm0gPSBUUlVFKQoKIyBQbG90IHRoZSBvdmVyYWxsIGF2ZXJhZ2VzCnBsb3Qob3ZlcmFsbF9hdmVyYWdlX01NX3BubCwgdHlwZSA9ICJsIiwgcGNoID0gMTYsIGNvbCA9ICJibGFjayIsIG1haW4gPSAiT3ZlcmFsbCBBdmVyYWdlIFBOTCIsIHhsYWIgPSAiUG9zaXRpb24gaW4gTGlzdCIsIHlsYWIgPSAiVmFsdWUiLCB5bGltID0gYyhtaW4oYyhvdmVyYWxsX2F2ZXJhZ2VfTU1fcG5sLCBvdmVyYWxsX2F2ZXJhZ2VfU3RvY2hOb2lzeTFfcG5sLCBvdmVyYWxsX2F2ZXJhZ2VfU3RvY2hOb2lzeTJfcG5sLCBvdmVyYWxsX2F2ZXJhZ2VfU3RvY2hOb2lzeTNfcG5sLCBvdmVyYWxsX2F2ZXJhZ2VfU3RvY2hOb2lzeTRfcG5sLCBvdmVyYWxsX2F2ZXJhZ2VfU3RvY2hOb2lzeTVfcG5sLCBvdmVyYWxsX2F2ZXJhZ2VfU3RvY2hOb2lzeTZfcG5sKSksIG1heChjKG92ZXJhbGxfYXZlcmFnZV9NTV9wbmwsIG92ZXJhbGxfYXZlcmFnZV9TdG9jaE5vaXN5MV9wbmwsIG92ZXJhbGxfYXZlcmFnZV9TdG9jaE5vaXN5Ml9wbmwsIG92ZXJhbGxfYXZlcmFnZV9TdG9jaE5vaXN5M19wbmwsIG92ZXJhbGxfYXZlcmFnZV9TdG9jaE5vaXN5NF9wbmwsIG92ZXJhbGxfYXZlcmFnZV9TdG9jaE5vaXN5NV9wbmwsIG92ZXJhbGxfYXZlcmFnZV9TdG9jaE5vaXN5Nl9wbmwpKSkpCmxpbmVzKG92ZXJhbGxfYXZlcmFnZV9TdG9jaE5vaXN5MV9wbmwsIHR5cGUgPSAibCIsIHBjaCA9IDE2LCBjb2wgPSAicmVkIikKbGluZXMob3ZlcmFsbF9hdmVyYWdlX1N0b2NoTm9pc3kyX3BubCwgdHlwZSA9ICJsIiwgcGNoID0gMTYsIGNvbCA9ICJncmVlbiIpCmxpbmVzKG92ZXJhbGxfYXZlcmFnZV9TdG9jaE5vaXN5M19wbmwsIHR5cGUgPSAibCIsIHBjaCA9IDE2LCBjb2wgPSAieWVsbG93IikKbGluZXMob3ZlcmFsbF9hdmVyYWdlX1N0b2NoTm9pc3k0X3BubCwgdHlwZSA9ICJsIiwgcGNoID0gMTYsIGNvbCA9ICJibHVlIikKbGluZXMob3ZlcmFsbF9hdmVyYWdlX1N0b2NoTm9pc3k1X3BubCwgdHlwZSA9ICJsIiwgcGNoID0gMTYsIGNvbCA9ICJwdXJwbGUiKQpsaW5lcyhvdmVyYWxsX2F2ZXJhZ2VfU3RvY2hOb2lzeTZfcG5sLCB0eXBlID0gImwiLCBwY2ggPSAxNiwgY29sID0gIm9yYW5nZSIpCgojIEFkZCBsZWdlbmQKbGVnZW5kKCJ0b3BsZWZ0IiwgbGVnZW5kID0gYygiTWFya2V0IE1ha2VyIiwgIlN0b2NoYWN0aWMgTm9pc3kgMSIsICJTdG9jaGFjdGljIE5vaXN5IDIiLCAiU3RvY2hhY3RpYyBOb2lzeSAzIiwgIlN0b2NoYWN0aWMgTm9pc3kgNCIsICJTdG9jaGFjdGljIE5vaXN5IDUiLCAiU3RvY2hhY3RpYyBOb2lzeSA2IiksIGNvbCA9IGMoImJsYWNrIiwgInJlZCIsICJncmVlbiIsICJ5ZWxsb3ciLCAiYmx1ZSIsICJwdXJwbGUiLCAib3JhbmdlIiksIGx0eSA9IDEsIGNleCA9IDAuOCkKYGBgCgoKYGBge3J9CiMgSW5pdGlhbGl6ZSBtYXRyaWNlcyB0byBzdG9yZSBhdmVyYWdlcyBmb3IgZWFjaCBwb3NpdGlvbgphdmVyYWdlX01NX3BvcyA8LSBtYXRyaXgoTkEsIG5yb3cgPSAxMDAsIG5jb2wgPSAxMCkKYXZlcmFnZV9TdG9jaE5vaXN5MV9wb3MgPC0gbWF0cml4KE5BLCBucm93ID0gMTAwLCBuY29sID0gMTApCmF2ZXJhZ2VfU3RvY2hOb2lzeTJfcG9zIDwtIG1hdHJpeChOQSwgbnJvdyA9IDEwMCwgbmNvbCA9IDEwKQphdmVyYWdlX1N0b2NoTm9pc3kzX3BvcyA8LSBtYXRyaXgoTkEsIG5yb3cgPSAxMDAsIG5jb2wgPSAxMCkKYXZlcmFnZV9TdG9jaE5vaXN5NF9wb3MgPC0gbWF0cml4KE5BLCBucm93ID0gMTAwLCBuY29sID0gMTApCmF2ZXJhZ2VfU3RvY2hOb2lzeTVfcG9zIDwtIG1hdHJpeChOQSwgbnJvdyA9IDEwMCwgbmNvbCA9IDEwKQphdmVyYWdlX1N0b2NoTm9pc3k2X3BvcyA8LSBtYXRyaXgoTkEsIG5yb3cgPSAxMDAsIG5jb2wgPSAxMCkKCiMgTG9vcCB0aHJvdWdoIGVhY2ggc2ltdWxhdGlvbiAobikKZm9yIChuIGluIDE6MTApIHsKCiAgTU1fcG9zX3NldDEyIDwtIHN0cnNwbGl0KGdzdWIoIlxcW3xcXF0iLCAiIiwgdW5saXN0KGFnZ3JlZ2F0ZWRfcmVzdWx0c18xMltuLCA3XSkpLCAiLCAiKQoKICBTdG9jaE5vaXN5MV9wb3Nfc2V0MTIgPC0gc3Ryc3BsaXQoZ3N1YigiXFxbfFxcXSIsICIiLCB1bmxpc3QoYWdncmVnYXRlZF9yZXN1bHRzXzEyW24sIDldKSksICIsICIpCiAgCiAgU3RvY2hOb2lzeTJfcG9zX3NldDEyIDwtIHN0cnNwbGl0KGdzdWIoIlxcW3xcXF0iLCAiIiwgdW5saXN0KGFnZ3JlZ2F0ZWRfcmVzdWx0c18xMltuLCAxMV0pKSwgIiwgIikKICAKICBTdG9jaE5vaXN5M19wb3Nfc2V0MTIgPC0gc3Ryc3BsaXQoZ3N1YigiXFxbfFxcXSIsICIiLCB1bmxpc3QoYWdncmVnYXRlZF9yZXN1bHRzXzEyW24sIDEzXSkpLCAiLCAiKQogIAogIFN0b2NoTm9pc3k0X3Bvc19zZXQxMiA8LSBzdHJzcGxpdChnc3ViKCJcXFt8XFxdIiwgIiIsIHVubGlzdChhZ2dyZWdhdGVkX3Jlc3VsdHNfMTJbbiwgMTVdKSksICIsICIpCiAgCiAgU3RvY2hOb2lzeTVfcG9zX3NldDEyIDwtIHN0cnNwbGl0KGdzdWIoIlxcW3xcXF0iLCAiIiwgdW5saXN0KGFnZ3JlZ2F0ZWRfcmVzdWx0c18xMltuLCAxN10pKSwgIiwgIikKICAKICBTdG9jaE5vaXN5Nl9wb3Nfc2V0MTIgPC0gc3Ryc3BsaXQoZ3N1YigiXFxbfFxcXSIsICIiLCB1bmxpc3QoYWdncmVnYXRlZF9yZXN1bHRzXzEyW24sIDE5XSkpLCAiLCAiKQogIAogICMgTG9vcCB0aHJvdWdoIGVhY2ggcG9zaXRpb24gKGkpCiAgZm9yIChpIGluIDE6MTAwKSB7CiAgICAjIEV4dHJhY3QgVHJ1ZSBhbmQgRXhwZWN0ZWQgdmFsdWVzIGZvciB0aGUgaS10aCBwb3NpdGlvbgogICAgTU1fcG9zIDwtIHNhcHBseShNTV9wb3Nfc2V0MTIsIGZ1bmN0aW9uKHgpIGFzLm51bWVyaWMoeFtpXSkpCiAgICBTdG9jaE5vaXN5MV9wb3MgPC0gc2FwcGx5KFN0b2NoTm9pc3kxX3Bvc19zZXQxMiwgZnVuY3Rpb24oeCkgYXMubnVtZXJpYyh4W2ldKSkKICAgIFN0b2NoTm9pc3kyX3BvcyA8LSBzYXBwbHkoU3RvY2hOb2lzeTJfcG9zX3NldDEyLCBmdW5jdGlvbih4KSBhcy5udW1lcmljKHhbaV0pKQogICAgU3RvY2hOb2lzeTNfcG9zIDwtIHNhcHBseShTdG9jaE5vaXN5M19wb3Nfc2V0MTIsIGZ1bmN0aW9uKHgpIGFzLm51bWVyaWMoeFtpXSkpCiAgICBTdG9jaE5vaXN5NF9wb3MgPC0gc2FwcGx5KFN0b2NoTm9pc3k0X3Bvc19zZXQxMiwgZnVuY3Rpb24oeCkgYXMubnVtZXJpYyh4W2ldKSkKICAgIFN0b2NoTm9pc3k1X3BvcyA8LSBzYXBwbHkoU3RvY2hOb2lzeTVfcG9zX3NldDEyLCBmdW5jdGlvbih4KSBhcy5udW1lcmljKHhbaV0pKQogICAgU3RvY2hOb2lzeTZfcG9zIDwtIHNhcHBseShTdG9jaE5vaXN5Nl9wb3Nfc2V0MTIsIGZ1bmN0aW9uKHgpIGFzLm51bWVyaWMoeFtpXSkpCiAgICAKICAgICMgQ2FsY3VsYXRlIHRoZSBhdmVyYWdlIG9mIFRydWUgYW5kIEV4cGVjdGVkIHZhbHVlcyBmb3IgdGhlIGktdGggcG9zaXRpb24KICAgIGF2ZXJhZ2VfTU1fcG9zW2ksIG5dIDwtIG1lYW4oTU1fcG9zLCBuYS5ybSA9IFRSVUUpCiAgICBhdmVyYWdlX1N0b2NoTm9pc3kxX3Bvc1tpLCBuXSA8LSBtZWFuKFN0b2NoTm9pc3kxX3BvcywgbmEucm0gPSBUUlVFKQogICAgYXZlcmFnZV9TdG9jaE5vaXN5Ml9wb3NbaSwgbl0gPC0gbWVhbihTdG9jaE5vaXN5Ml9wb3MsIG5hLnJtID0gVFJVRSkKICAgIGF2ZXJhZ2VfU3RvY2hOb2lzeTNfcG9zW2ksIG5dIDwtIG1lYW4oU3RvY2hOb2lzeTNfcG9zLCBuYS5ybSA9IFRSVUUpCiAgICBhdmVyYWdlX1N0b2NoTm9pc3k0X3Bvc1tpLCBuXSA8LSBtZWFuKFN0b2NoTm9pc3k0X3BvcywgbmEucm0gPSBUUlVFKQogICAgYXZlcmFnZV9TdG9jaE5vaXN5NV9wb3NbaSwgbl0gPC0gbWVhbihTdG9jaE5vaXN5NV9wb3MsIG5hLnJtID0gVFJVRSkKICAgIGF2ZXJhZ2VfU3RvY2hOb2lzeTZfcG9zW2ksIG5dIDwtIG1lYW4oU3RvY2hOb2lzeTZfcG9zLCBuYS5ybSA9IFRSVUUpCiAgfQp9CgojIENhbGN1bGF0ZSB0aGUgb3ZlcmFsbCBhdmVyYWdlIGZvciBlYWNoIHBvc2l0aW9uIGFjcm9zcyBhbGwgc2ltdWxhdGlvbnMKb3ZlcmFsbF9hdmVyYWdlX01NX3BvcyA8LSByb3dNZWFucyhhdmVyYWdlX01NX3BvcywgbmEucm0gPSBUUlVFKQpvdmVyYWxsX2F2ZXJhZ2VfU3RvY2hOb2lzeTFfcG9zIDwtIHJvd01lYW5zKGF2ZXJhZ2VfU3RvY2hOb2lzeTFfcG9zLCBuYS5ybSA9IFRSVUUpCm92ZXJhbGxfYXZlcmFnZV9TdG9jaE5vaXN5Ml9wb3MgPC0gcm93TWVhbnMoYXZlcmFnZV9TdG9jaE5vaXN5Ml9wb3MsIG5hLnJtID0gVFJVRSkKb3ZlcmFsbF9hdmVyYWdlX1N0b2NoTm9pc3kzX3BvcyA8LSByb3dNZWFucyhhdmVyYWdlX1N0b2NoTm9pc3kzX3BvcywgbmEucm0gPSBUUlVFKQpvdmVyYWxsX2F2ZXJhZ2VfU3RvY2hOb2lzeTRfcG9zIDwtIHJvd01lYW5zKGF2ZXJhZ2VfU3RvY2hOb2lzeTRfcG9zLCBuYS5ybSA9IFRSVUUpCm92ZXJhbGxfYXZlcmFnZV9TdG9jaE5vaXN5NV9wb3MgPC0gcm93TWVhbnMoYXZlcmFnZV9TdG9jaE5vaXN5NV9wb3MsIG5hLnJtID0gVFJVRSkKb3ZlcmFsbF9hdmVyYWdlX1N0b2NoTm9pc3k2X3BvcyA8LSByb3dNZWFucyhhdmVyYWdlX1N0b2NoTm9pc3k2X3BvcywgbmEucm0gPSBUUlVFKQoKIyBQbG90IHRoZSBvdmVyYWxsIGF2ZXJhZ2VzCnBsb3Qob3ZlcmFsbF9hdmVyYWdlX01NX3BvcywgdHlwZSA9ICJsIiwgcGNoID0gMTYsIGNvbCA9ICJibGFjayIsIG1haW4gPSAiT3ZlcmFsbCBBdmVyYWdlIFBvc2l0aW9uIiwgeGxhYiA9ICJQb3NpdGlvbiBpbiBMaXN0IiwgeWxhYiA9ICJWYWx1ZSIsIHlsaW0gPSBjKG1pbihjKG92ZXJhbGxfYXZlcmFnZV9NTV9wb3MsIG92ZXJhbGxfYXZlcmFnZV9TdG9jaE5vaXN5MV9wb3MsIG92ZXJhbGxfYXZlcmFnZV9TdG9jaE5vaXN5Ml9wb3MsIG92ZXJhbGxfYXZlcmFnZV9TdG9jaE5vaXN5M19wb3MsIG92ZXJhbGxfYXZlcmFnZV9TdG9jaE5vaXN5NF9wb3MsIG92ZXJhbGxfYXZlcmFnZV9TdG9jaE5vaXN5NV9wb3MsIG92ZXJhbGxfYXZlcmFnZV9TdG9jaE5vaXN5Nl9wb3MpKSwgbWF4KGMob3ZlcmFsbF9hdmVyYWdlX01NX3Bvcywgb3ZlcmFsbF9hdmVyYWdlX1N0b2NoTm9pc3kxX3Bvcywgb3ZlcmFsbF9hdmVyYWdlX1N0b2NoTm9pc3kyX3Bvcywgb3ZlcmFsbF9hdmVyYWdlX1N0b2NoTm9pc3kzX3Bvcywgb3ZlcmFsbF9hdmVyYWdlX1N0b2NoTm9pc3k0X3Bvcywgb3ZlcmFsbF9hdmVyYWdlX1N0b2NoTm9pc3k1X3Bvcywgb3ZlcmFsbF9hdmVyYWdlX1N0b2NoTm9pc3k2X3BvcykpKSkKbGluZXMob3ZlcmFsbF9hdmVyYWdlX1N0b2NoTm9pc3kxX3BvcywgdHlwZSA9ICJsIiwgcGNoID0gMTYsIGNvbCA9ICJyZWQiKQpsaW5lcyhvdmVyYWxsX2F2ZXJhZ2VfU3RvY2hOb2lzeTJfcG9zLCB0eXBlID0gImwiLCBwY2ggPSAxNiwgY29sID0gImdyZWVuIikKbGluZXMob3ZlcmFsbF9hdmVyYWdlX1N0b2NoTm9pc3kzX3BvcywgdHlwZSA9ICJsIiwgcGNoID0gMTYsIGNvbCA9ICJ5ZWxsb3ciKQpsaW5lcyhvdmVyYWxsX2F2ZXJhZ2VfU3RvY2hOb2lzeTRfcG9zLCB0eXBlID0gImwiLCBwY2ggPSAxNiwgY29sID0gImJsdWUiKQpsaW5lcyhvdmVyYWxsX2F2ZXJhZ2VfU3RvY2hOb2lzeTVfcG9zLCB0eXBlID0gImwiLCBwY2ggPSAxNiwgY29sID0gInB1cnBsZSIpCmxpbmVzKG92ZXJhbGxfYXZlcmFnZV9TdG9jaE5vaXN5Nl9wb3MsIHR5cGUgPSAibCIsIHBjaCA9IDE2LCBjb2wgPSAib3JhbmdlIikKCiMgQWRkIGxlZ2VuZApsZWdlbmQoInRvcGxlZnQiLCBsZWdlbmQgPSBjKCJNYXJrZXQgTWFrZXIiLCAiU3RvY2hhc3RpYyBOb2lzeSAxIiwgIlN0b2NoYXN0aWMgTm9pc3kgMiIsICJTdG9jaGFzdGljIE5vaXN5IDMiLCAiU3RvY2hhc3RpYyBOb2lzeSA0IiwgIlN0b2NoYXN0aWMgTm9pc3kgNSIsICJTdG9jaGFzdGljIE5vaXN5IDYiKSwgY29sID0gYygiYmxhY2siLCAicmVkIiwgImdyZWVuIiwgInllbGxvdyIsICJibHVlIiwgInB1cnBsZSIsICJvcmFuZ2UiKSwgbHR5ID0gMSwgY2V4ID0gMC44KQpgYGAKCgoKIyMgc2V0MTMgKDYgbm9pc3kgaW5mb3JtZWQpCgpgYGB7cn0KIyBJbml0aWFsaXplIG1hdHJpY2VzIHRvIHN0b3JlIGF2ZXJhZ2VzIGZvciBlYWNoIHBvc2l0aW9uCmF2ZXJhZ2VfYmlkIDwtIG1hdHJpeChOQSwgbnJvdyA9IDEwMCwgbmNvbCA9IDEwKQphdmVyYWdlX2FzayA8LSBtYXRyaXgoTkEsIG5yb3cgPSAxMDAsIG5jb2wgPSAxMCkKCiMgTG9vcCB0aHJvdWdoIGVhY2ggc2ltdWxhdGlvbiAobikKZm9yIChuIGluIDE6MTApIHsKICAjIEV4dHJhY3QgVHJ1ZSB2YWx1ZXMgZnJvbSB0aGUgYWdncmVnYXRlZF9yZXN1bHRzXzQgZGF0YWZyYW1lCiAgQmlkc19zZXQxMyA8LSBzdHJzcGxpdChnc3ViKCJcXFt8XFxdIiwgIiIsIHVubGlzdChhZ2dyZWdhdGVkX3Jlc3VsdHNfMTNbbiwgNF0pKSwgIiwgIikKICAKICAjIEV4dHJhY3QgRXhwZWN0ZWQgdmFsdWVzIGZyb20gdGhlIGFnZ3JlZ2F0ZWRfcmVzdWx0c180IGRhdGFmcmFtZQogIEFza3Nfc2V0MTMgPC0gc3Ryc3BsaXQoZ3N1YigiXFxbfFxcXSIsICIiLCB1bmxpc3QoYWdncmVnYXRlZF9yZXN1bHRzXzEzW24sIDVdKSksICIsICIpCiAgCiAgIyBMb29wIHRocm91Z2ggZWFjaCBwb3NpdGlvbiAoaSkKICBmb3IgKGkgaW4gMToxMDApIHsKICAgICMgRXh0cmFjdCBUcnVlIGFuZCBFeHBlY3RlZCB2YWx1ZXMgZm9yIHRoZSBpLXRoIHBvc2l0aW9uCiAgICBCaWRzIDwtIHNhcHBseShCaWRzX3NldDEzLCBmdW5jdGlvbih4KSBhcy5udW1lcmljKHhbaV0pKQogICAgQXNrcyA8LSBzYXBwbHkoQXNrc19zZXQxMywgZnVuY3Rpb24oeCkgYXMubnVtZXJpYyh4W2ldKSkKICAgIAogICAgIyBDYWxjdWxhdGUgdGhlIGF2ZXJhZ2Ugb2YgVHJ1ZSBhbmQgRXhwZWN0ZWQgdmFsdWVzIGZvciB0aGUgaS10aCBwb3NpdGlvbgogICAgYXZlcmFnZV9iaWRbaSwgbl0gPC0gbWVhbihCaWRzLCBuYS5ybSA9IFRSVUUpCiAgICBhdmVyYWdlX2Fza1tpLCBuXSA8LSBtZWFuKEFza3MsIG5hLnJtID0gVFJVRSkKICB9Cn0KCiMgQ2FsY3VsYXRlIHRoZSBvdmVyYWxsIGF2ZXJhZ2UgZm9yIGVhY2ggcG9zaXRpb24gYWNyb3NzIGFsbCBzaW11bGF0aW9ucwpvdmVyYWxsX2F2ZXJhZ2VfYmlkIDwtIHJvd01lYW5zKGF2ZXJhZ2VfYmlkLCBuYS5ybSA9IFRSVUUpCm92ZXJhbGxfYXZlcmFnZV9hc2sgPC0gcm93TWVhbnMoYXZlcmFnZV9hc2ssIG5hLnJtID0gVFJVRSkKCiMjIFRydWUgVmFsdWUKIyBJbml0aWFsaXplIG1hdHJpY2VzIHRvIHN0b3JlIGF2ZXJhZ2VzIGZvciBlYWNoIHBvc2l0aW9uCmF2ZXJhZ2VfdHJ1ZSA8LSBtYXRyaXgoTkEsIG5yb3cgPSAxMDAsIG5jb2wgPSAxMCkKYXZlcmFnZV9leHBlY3RlZCA8LSBtYXRyaXgoTkEsIG5yb3cgPSAxMDAsIG5jb2wgPSAxMCkKCiMgTG9vcCB0aHJvdWdoIGVhY2ggc2ltdWxhdGlvbiAobikKZm9yIChuIGluIDE6MTApIHsKICAjIEV4dHJhY3QgVHJ1ZSB2YWx1ZXMgZnJvbSB0aGUgYWdncmVnYXRlZF9yZXN1bHRzXzQgZGF0YWZyYW1lCiAgVHJ1ZVZhbHVlc19zZXQxMyA8LSBzdHJzcGxpdChnc3ViKCJcXFt8XFxdIiwgIiIsIHVubGlzdChhZ2dyZWdhdGVkX3Jlc3VsdHNfMTNbbiwgMl0pKSwgIiwgIikKICAKICAjIEV4dHJhY3QgRXhwZWN0ZWQgdmFsdWVzIGZyb20gdGhlIGFnZ3JlZ2F0ZWRfcmVzdWx0c180IGRhdGFmcmFtZQogIEV4cGVjdGVkVmFsdWVzX3NldDEzIDwtIHN0cnNwbGl0KGdzdWIoIlxcW3xcXF0iLCAiIiwgdW5saXN0KGFnZ3JlZ2F0ZWRfcmVzdWx0c18xM1tuLCAzXSkpLCAiLCAiKQogIAogICMgTG9vcCB0aHJvdWdoIGVhY2ggcG9zaXRpb24gKGkpCiAgZm9yIChpIGluIDE6MTAwKSB7CiAgICAjIEV4dHJhY3QgVHJ1ZSBhbmQgRXhwZWN0ZWQgdmFsdWVzIGZvciB0aGUgaS10aCBwb3NpdGlvbgogICAgVHJ1ZV92YWx1ZXMgPC0gc2FwcGx5KFRydWVWYWx1ZXNfc2V0MTMsIGZ1bmN0aW9uKHgpIGFzLm51bWVyaWMoeFtpXSkpCiAgICBFeHBlY3RlZF92YWx1ZXMgPC0gc2FwcGx5KEV4cGVjdGVkVmFsdWVzX3NldDEzLCBmdW5jdGlvbih4KSBhcy5udW1lcmljKHhbaV0pKQogICAgCiAgICAjIENhbGN1bGF0ZSB0aGUgYXZlcmFnZSBvZiBUcnVlIGFuZCBFeHBlY3RlZCB2YWx1ZXMgZm9yIHRoZSBpLXRoIHBvc2l0aW9uCiAgICBhdmVyYWdlX3RydWVbaSwgbl0gPC0gbWVhbihUcnVlX3ZhbHVlcywgbmEucm0gPSBUUlVFKQogICAgYXZlcmFnZV9leHBlY3RlZFtpLCBuXSA8LSBtZWFuKEV4cGVjdGVkX3ZhbHVlcywgbmEucm0gPSBUUlVFKQogIH0KfQoKIyBDYWxjdWxhdGUgdGhlIG92ZXJhbGwgYXZlcmFnZSBmb3IgZWFjaCBwb3NpdGlvbiBhY3Jvc3MgYWxsIHNpbXVsYXRpb25zCm92ZXJhbGxfYXZlcmFnZV90cnVlIDwtIHJvd01lYW5zKGF2ZXJhZ2VfdHJ1ZSwgbmEucm0gPSBUUlVFKQpvdmVyYWxsX2F2ZXJhZ2VfZXhwZWN0ZWQgPC0gcm93TWVhbnMoYXZlcmFnZV9leHBlY3RlZCwgbmEucm0gPSBUUlVFKQoKIyBQbG90IHRoZSBvdmVyYWxsIGF2ZXJhZ2VzCiNwbG90KG92ZXJhbGxfYXZlcmFnZV90cnVlLCB0eXBlID0gImwiLCBwY2ggPSAxNiwgY29sID0gImJsdWUiLCBtYWluID0gIk92ZXJhbGwgQXZlcmFnZSBvZiBUcnVlIHZzIEV4cGVjdGVkIFZhbHVlcyIsIHhsYWIgPSAiUG9zaXRpb24gaW4gTGlzdCIsIHlsYWIgPSAiVmFsdWUiLCB5bGltID0gYyhtaW4oYyhvdmVyYWxsX2F2ZXJhZ2VfdHJ1ZSwgb3ZlcmFsbF9hdmVyYWdlX2V4cGVjdGVkKSksIG1heChjKG92ZXJhbGxfYXZlcmFnZV90cnVlLCBvdmVyYWxsX2F2ZXJhZ2VfZXhwZWN0ZWQpKSkpCiNsaW5lcyhvdmVyYWxsX2F2ZXJhZ2VfZXhwZWN0ZWQsIHR5cGUgPSAibCIsIHBjaCA9IDE2LCBjb2wgPSAicmVkIikKI2xlZ2VuZCgidG9wcmlnaHQiLCBsZWdlbmQgPSBjKCJUcnVlIFZhbHVlcyIsICJFeHBlY3RlZCBWYWx1ZXMiKSwgY29sID0gYygiYmx1ZSIsICJyZWQiKSwgbHR5ID0gMSwgY2V4ID0gMC44KQoKIyBQbG90IHRoZSBvdmVyYWxsIGF2ZXJhZ2VzCnBsb3Qob3ZlcmFsbF9hdmVyYWdlX2JpZCwgdHlwZSA9ICJsIiwgcGNoID0gMTYsIGNvbCA9ICJibHVlIiwgbWFpbiA9ICJPdmVyYWxsIEF2ZXJhZ2Ugb2YgQmlkcyB2cyBBc2tzICYgVHJ1ZSB2cyBFeHBlY3RlZCBWYWx1ZXMiLCB4bGFiID0gIlBvc2l0aW9uIGluIExpc3QiLCB5bGFiID0gIlZhbHVlIiwgeWxpbSA9IGMobWluKGMob3ZlcmFsbF9hdmVyYWdlX2JpZCwgb3ZlcmFsbF9hdmVyYWdlX2Fzaywgb3ZlcmFsbF9hdmVyYWdlX3RydWUsIG92ZXJhbGxfYXZlcmFnZV9leHBlY3RlZCkpLCBtYXgoYyhvdmVyYWxsX2F2ZXJhZ2VfYmlkLCBvdmVyYWxsX2F2ZXJhZ2VfYXNrLCBvdmVyYWxsX2F2ZXJhZ2VfdHJ1ZSwgb3ZlcmFsbF9hdmVyYWdlX2V4cGVjdGVkKSkpKQpsaW5lcyhvdmVyYWxsX2F2ZXJhZ2VfYXNrLCB0eXBlID0gImwiLCBwY2ggPSAxNiwgY29sID0gInJlZCIpCmxpbmVzKG92ZXJhbGxfYXZlcmFnZV90cnVlLCB0eXBlID0gImwiLCBwY2ggPSAxNiwgY29sID0gImdyZWVuIikKbGluZXMob3ZlcmFsbF9hdmVyYWdlX2V4cGVjdGVkLCB0eXBlID0gImwiLCBwY2ggPSAxNiwgY29sID0gInB1cnBsZSIpCmxlZ2VuZCgiYm90dG9tbGVmdCIsIGxlZ2VuZCA9IGMoIkJpZHMiLCAiQXNrcyIsICJUcnVlIFZhbHVlIiwgIkV4cGVjdGVkIFZhbHVlIiksIGNvbCA9IGMoImJsdWUiLCAicmVkIiwgImdyZWVuIiwgInB1cnBsZSIpLCBsdHkgPSAxLCBjZXggPSAwLjgpCmBgYAoKYGBge3J9CiMgSW5pdGlhbGl6ZSBtYXRyaWNlcyB0byBzdG9yZSBhdmVyYWdlcyBmb3IgZWFjaCBwb3NpdGlvbgphdmVyYWdlX01NX3BubCA8LSBtYXRyaXgoTkEsIG5yb3cgPSAxMDAsIG5jb2wgPSAxMCkKYXZlcmFnZV9Ob2lzeUluZm9ybWVkMV9wbmwgPC0gbWF0cml4KE5BLCBucm93ID0gMTAwLCBuY29sID0gMTApCmF2ZXJhZ2VfTm9pc3lJbmZvcm1lZDJfcG5sIDwtIG1hdHJpeChOQSwgbnJvdyA9IDEwMCwgbmNvbCA9IDEwKQphdmVyYWdlX05vaXN5SW5mb3JtZWQzX3BubCA8LSBtYXRyaXgoTkEsIG5yb3cgPSAxMDAsIG5jb2wgPSAxMCkKYXZlcmFnZV9Ob2lzeUluZm9ybWVkNF9wbmwgPC0gbWF0cml4KE5BLCBucm93ID0gMTAwLCBuY29sID0gMTApCmF2ZXJhZ2VfTm9pc3lJbmZvcm1lZDVfcG5sIDwtIG1hdHJpeChOQSwgbnJvdyA9IDEwMCwgbmNvbCA9IDEwKQphdmVyYWdlX05vaXN5SW5mb3JtZWQ2X3BubCA8LSBtYXRyaXgoTkEsIG5yb3cgPSAxMDAsIG5jb2wgPSAxMCkKCiMgTG9vcCB0aHJvdWdoIGVhY2ggc2ltdWxhdGlvbiAobikKZm9yIChuIGluIDE6MTApIHsKCiAgTU1fcG5sX3NldDEzIDwtIHN0cnNwbGl0KGdzdWIoIlxcW3xcXF0iLCAiIiwgdW5saXN0KGFnZ3JlZ2F0ZWRfcmVzdWx0c18xM1tuLCA2XSkpLCAiLCAiKQoKICBOb2lzeUluZm9ybWVkMV9wbmxfc2V0MTMgPC0gc3Ryc3BsaXQoZ3N1YigiXFxbfFxcXSIsICIiLCB1bmxpc3QoYWdncmVnYXRlZF9yZXN1bHRzXzEzW24sIDhdKSksICIsICIpCiAgCiAgTm9pc3lJbmZvcm1lZDJfcG5sX3NldDEzIDwtIHN0cnNwbGl0KGdzdWIoIlxcW3xcXF0iLCAiIiwgdW5saXN0KGFnZ3JlZ2F0ZWRfcmVzdWx0c18xM1tuLCAxMF0pKSwgIiwgIikKICAKICBOb2lzeUluZm9ybWVkM19wbmxfc2V0MTMgPC0gc3Ryc3BsaXQoZ3N1YigiXFxbfFxcXSIsICIiLCB1bmxpc3QoYWdncmVnYXRlZF9yZXN1bHRzXzEzW24sIDEyXSkpLCAiLCAiKQogIAogIE5vaXN5SW5mb3JtZWQ0X3BubF9zZXQxMyA8LSBzdHJzcGxpdChnc3ViKCJcXFt8XFxdIiwgIiIsIHVubGlzdChhZ2dyZWdhdGVkX3Jlc3VsdHNfMTNbbiwgMTRdKSksICIsICIpCiAgCiAgTm9pc3lJbmZvcm1lZDVfcG5sX3NldDEzIDwtIHN0cnNwbGl0KGdzdWIoIlxcW3xcXF0iLCAiIiwgdW5saXN0KGFnZ3JlZ2F0ZWRfcmVzdWx0c18xM1tuLCAxNl0pKSwgIiwgIikKICAKICBOb2lzeUluZm9ybWVkNl9wbmxfc2V0MTMgPC0gc3Ryc3BsaXQoZ3N1YigiXFxbfFxcXSIsICIiLCB1bmxpc3QoYWdncmVnYXRlZF9yZXN1bHRzXzEzW24sIDE4XSkpLCAiLCAiKQogIAogICMgTG9vcCB0aHJvdWdoIGVhY2ggcG9zaXRpb24gKGkpCiAgZm9yIChpIGluIDE6MTAwKSB7CiAgICAjIEV4dHJhY3QgVHJ1ZSBhbmQgRXhwZWN0ZWQgdmFsdWVzIGZvciB0aGUgaS10aCBwb3NpdGlvbgogICAgTU1fcG5sIDwtIHNhcHBseShNTV9wbmxfc2V0MTMsIGZ1bmN0aW9uKHgpIGFzLm51bWVyaWMoeFtpXSkpCiAgICBOb2lzeUluZm9ybWVkMV9wbmwgPC0gc2FwcGx5KE5vaXN5SW5mb3JtZWQxX3BubF9zZXQxMywgZnVuY3Rpb24oeCkgYXMubnVtZXJpYyh4W2ldKSkKICAgIE5vaXN5SW5mb3JtZWQyX3BubCA8LSBzYXBwbHkoTm9pc3lJbmZvcm1lZDJfcG5sX3NldDEzLCBmdW5jdGlvbih4KSBhcy5udW1lcmljKHhbaV0pKQogICAgTm9pc3lJbmZvcm1lZDNfcG5sIDwtIHNhcHBseShOb2lzeUluZm9ybWVkM19wbmxfc2V0MTMsIGZ1bmN0aW9uKHgpIGFzLm51bWVyaWMoeFtpXSkpCiAgICBOb2lzeUluZm9ybWVkNF9wbmwgPC0gc2FwcGx5KE5vaXN5SW5mb3JtZWQ0X3BubF9zZXQxMywgZnVuY3Rpb24oeCkgYXMubnVtZXJpYyh4W2ldKSkKICAgIE5vaXN5SW5mb3JtZWQ1X3BubCA8LSBzYXBwbHkoTm9pc3lJbmZvcm1lZDVfcG5sX3NldDEzLCBmdW5jdGlvbih4KSBhcy5udW1lcmljKHhbaV0pKQogICAgTm9pc3lJbmZvcm1lZDZfcG5sIDwtIHNhcHBseShOb2lzeUluZm9ybWVkNl9wbmxfc2V0MTMsIGZ1bmN0aW9uKHgpIGFzLm51bWVyaWMoeFtpXSkpCiAgICAKICAgICMgQ2FsY3VsYXRlIHRoZSBhdmVyYWdlIG9mIFRydWUgYW5kIEV4cGVjdGVkIHZhbHVlcyBmb3IgdGhlIGktdGggcG9zaXRpb24KICAgIGF2ZXJhZ2VfTU1fcG5sW2ksIG5dIDwtIG1lYW4oTU1fcG5sLCBuYS5ybSA9IFRSVUUpCiAgICBhdmVyYWdlX05vaXN5SW5mb3JtZWQxX3BubFtpLCBuXSA8LSBtZWFuKE5vaXN5SW5mb3JtZWQxX3BubCwgbmEucm0gPSBUUlVFKQogICAgYXZlcmFnZV9Ob2lzeUluZm9ybWVkMl9wbmxbaSwgbl0gPC0gbWVhbihOb2lzeUluZm9ybWVkMl9wbmwsIG5hLnJtID0gVFJVRSkKICAgIGF2ZXJhZ2VfTm9pc3lJbmZvcm1lZDNfcG5sW2ksIG5dIDwtIG1lYW4oTm9pc3lJbmZvcm1lZDNfcG5sLCBuYS5ybSA9IFRSVUUpCiAgICBhdmVyYWdlX05vaXN5SW5mb3JtZWQ0X3BubFtpLCBuXSA8LSBtZWFuKE5vaXN5SW5mb3JtZWQ0X3BubCwgbmEucm0gPSBUUlVFKQogICAgYXZlcmFnZV9Ob2lzeUluZm9ybWVkNV9wbmxbaSwgbl0gPC0gbWVhbihOb2lzeUluZm9ybWVkNV9wbmwsIG5hLnJtID0gVFJVRSkKICAgIGF2ZXJhZ2VfTm9pc3lJbmZvcm1lZDZfcG5sW2ksIG5dIDwtIG1lYW4oTm9pc3lJbmZvcm1lZDZfcG5sLCBuYS5ybSA9IFRSVUUpCiAgfQp9CgojIENhbGN1bGF0ZSB0aGUgb3ZlcmFsbCBhdmVyYWdlIGZvciBlYWNoIHBvc2l0aW9uIGFjcm9zcyBhbGwgc2ltdWxhdGlvbnMKb3ZlcmFsbF9hdmVyYWdlX01NX3BubCA8LSByb3dNZWFucyhhdmVyYWdlX01NX3BubCwgbmEucm0gPSBUUlVFKQpvdmVyYWxsX2F2ZXJhZ2VfTm9pc3lJbmZvcm1lZDFfcG5sIDwtIHJvd01lYW5zKGF2ZXJhZ2VfTm9pc3lJbmZvcm1lZDFfcG5sLCBuYS5ybSA9IFRSVUUpCm92ZXJhbGxfYXZlcmFnZV9Ob2lzeUluZm9ybWVkMl9wbmwgPC0gcm93TWVhbnMoYXZlcmFnZV9Ob2lzeUluZm9ybWVkMl9wbmwsIG5hLnJtID0gVFJVRSkKb3ZlcmFsbF9hdmVyYWdlX05vaXN5SW5mb3JtZWQzX3BubCA8LSByb3dNZWFucyhhdmVyYWdlX05vaXN5SW5mb3JtZWQzX3BubCwgbmEucm0gPSBUUlVFKQpvdmVyYWxsX2F2ZXJhZ2VfTm9pc3lJbmZvcm1lZDRfcG5sIDwtIHJvd01lYW5zKGF2ZXJhZ2VfTm9pc3lJbmZvcm1lZDRfcG5sLCBuYS5ybSA9IFRSVUUpCm92ZXJhbGxfYXZlcmFnZV9Ob2lzeUluZm9ybWVkNV9wbmwgPC0gcm93TWVhbnMoYXZlcmFnZV9Ob2lzeUluZm9ybWVkNV9wbmwsIG5hLnJtID0gVFJVRSkKb3ZlcmFsbF9hdmVyYWdlX05vaXN5SW5mb3JtZWQ2X3BubCA8LSByb3dNZWFucyhhdmVyYWdlX05vaXN5SW5mb3JtZWQ2X3BubCwgbmEucm0gPSBUUlVFKQoKIyBQbG90IHRoZSBvdmVyYWxsIGF2ZXJhZ2VzCnBsb3Qob3ZlcmFsbF9hdmVyYWdlX01NX3BubCwgdHlwZSA9ICJsIiwgcGNoID0gMTYsIGNvbCA9ICJibGFjayIsIG1haW4gPSAiT3ZlcmFsbCBBdmVyYWdlIFBOTCIsIHhsYWIgPSAiUG9zaXRpb24gaW4gTGlzdCIsIHlsYWIgPSAiVmFsdWUiLCB5bGltID0gYyhtaW4oYyhvdmVyYWxsX2F2ZXJhZ2VfTU1fcG5sLCBvdmVyYWxsX2F2ZXJhZ2VfTm9pc3lJbmZvcm1lZDFfcG5sLCBvdmVyYWxsX2F2ZXJhZ2VfTm9pc3lJbmZvcm1lZDJfcG5sLCBvdmVyYWxsX2F2ZXJhZ2VfTm9pc3lJbmZvcm1lZDNfcG5sLCBvdmVyYWxsX2F2ZXJhZ2VfTm9pc3lJbmZvcm1lZDRfcG5sLCBvdmVyYWxsX2F2ZXJhZ2VfTm9pc3lJbmZvcm1lZDVfcG5sLCBvdmVyYWxsX2F2ZXJhZ2VfTm9pc3lJbmZvcm1lZDZfcG5sKSksIG1heChjKG92ZXJhbGxfYXZlcmFnZV9NTV9wbmwsIG92ZXJhbGxfYXZlcmFnZV9Ob2lzeUluZm9ybWVkMV9wbmwsIG92ZXJhbGxfYXZlcmFnZV9Ob2lzeUluZm9ybWVkMl9wbmwsIG92ZXJhbGxfYXZlcmFnZV9Ob2lzeUluZm9ybWVkM19wbmwsIG92ZXJhbGxfYXZlcmFnZV9Ob2lzeUluZm9ybWVkNF9wbmwsIG92ZXJhbGxfYXZlcmFnZV9Ob2lzeUluZm9ybWVkNV9wbmwsIG92ZXJhbGxfYXZlcmFnZV9Ob2lzeUluZm9ybWVkNl9wbmwpKSkpCmxpbmVzKG92ZXJhbGxfYXZlcmFnZV9Ob2lzeUluZm9ybWVkMV9wbmwsIHR5cGUgPSAibCIsIHBjaCA9IDE2LCBjb2wgPSAicmVkIikKbGluZXMob3ZlcmFsbF9hdmVyYWdlX05vaXN5SW5mb3JtZWQyX3BubCwgdHlwZSA9ICJsIiwgcGNoID0gMTYsIGNvbCA9ICJncmVlbiIpCmxpbmVzKG92ZXJhbGxfYXZlcmFnZV9Ob2lzeUluZm9ybWVkM19wbmwsIHR5cGUgPSAibCIsIHBjaCA9IDE2LCBjb2wgPSAieWVsbG93IikKbGluZXMob3ZlcmFsbF9hdmVyYWdlX05vaXN5SW5mb3JtZWQ0X3BubCwgdHlwZSA9ICJsIiwgcGNoID0gMTYsIGNvbCA9ICJibHVlIikKbGluZXMob3ZlcmFsbF9hdmVyYWdlX05vaXN5SW5mb3JtZWQ1X3BubCwgdHlwZSA9ICJsIiwgcGNoID0gMTYsIGNvbCA9ICJwdXJwbGUiKQpsaW5lcyhvdmVyYWxsX2F2ZXJhZ2VfTm9pc3lJbmZvcm1lZDZfcG5sLCB0eXBlID0gImwiLCBwY2ggPSAxNiwgY29sID0gIm9yYW5nZSIpCgojIEFkZCBsZWdlbmQKbGVnZW5kKCJib3R0b21sZWZ0IiwgbGVnZW5kID0gYygiTWFya2V0IE1ha2VyIiwgIk5vaXN5IEluZm9ybWVkIDEiLCAiTm9pc3kgSW5mb3JtZWQgMiIsICJOb2lzeSBJbmZvcm1lZCAzIiwgIk5vaXN5IEluZm9ybWVkIDQiLCAiTm9pc3kgSW5mb3JtZWQgNSIsICJOb2lzeSBJbmZvcm1lZCA2IiksIGNvbCA9IGMoImJsYWNrIiwgInJlZCIsICJncmVlbiIsICJ5ZWxsb3ciLCAiYmx1ZSIsICJwdXJwbGUiLCAib3JhbmdlIiksIGx0eSA9IDEsIGNleCA9IDAuOCkKYGBgCgoKYGBge3J9CiMgSW5pdGlhbGl6ZSBtYXRyaWNlcyB0byBzdG9yZSBhdmVyYWdlcyBmb3IgZWFjaCBwb3NpdGlvbgphdmVyYWdlX01NX3BvcyA8LSBtYXRyaXgoTkEsIG5yb3cgPSAxMDAsIG5jb2wgPSAxMCkKYXZlcmFnZV9Ob2lzeUluZm9ybWVkMV9wb3MgPC0gbWF0cml4KE5BLCBucm93ID0gMTAwLCBuY29sID0gMTApCmF2ZXJhZ2VfTm9pc3lJbmZvcm1lZDJfcG9zIDwtIG1hdHJpeChOQSwgbnJvdyA9IDEwMCwgbmNvbCA9IDEwKQphdmVyYWdlX05vaXN5SW5mb3JtZWQzX3BvcyA8LSBtYXRyaXgoTkEsIG5yb3cgPSAxMDAsIG5jb2wgPSAxMCkKYXZlcmFnZV9Ob2lzeUluZm9ybWVkNF9wb3MgPC0gbWF0cml4KE5BLCBucm93ID0gMTAwLCBuY29sID0gMTApCmF2ZXJhZ2VfTm9pc3lJbmZvcm1lZDVfcG9zIDwtIG1hdHJpeChOQSwgbnJvdyA9IDEwMCwgbmNvbCA9IDEwKQphdmVyYWdlX05vaXN5SW5mb3JtZWQ2X3BvcyA8LSBtYXRyaXgoTkEsIG5yb3cgPSAxMDAsIG5jb2wgPSAxMCkKCiMgTG9vcCB0aHJvdWdoIGVhY2ggc2ltdWxhdGlvbiAobikKZm9yIChuIGluIDE6MTApIHsKCiAgTU1fcG9zX3NldDEzIDwtIHN0cnNwbGl0KGdzdWIoIlxcW3xcXF0iLCAiIiwgdW5saXN0KGFnZ3JlZ2F0ZWRfcmVzdWx0c18xM1tuLCA3XSkpLCAiLCAiKQoKICBOb2lzeUluZm9ybWVkMV9wb3Nfc2V0MTMgPC0gc3Ryc3BsaXQoZ3N1YigiXFxbfFxcXSIsICIiLCB1bmxpc3QoYWdncmVnYXRlZF9yZXN1bHRzXzEzW24sIDldKSksICIsICIpCiAgCiAgTm9pc3lJbmZvcm1lZDJfcG9zX3NldDEzIDwtIHN0cnNwbGl0KGdzdWIoIlxcW3xcXF0iLCAiIiwgdW5saXN0KGFnZ3JlZ2F0ZWRfcmVzdWx0c18xM1tuLCAxMV0pKSwgIiwgIikKICAKICBOb2lzeUluZm9ybWVkM19wb3Nfc2V0MTMgPC0gc3Ryc3BsaXQoZ3N1YigiXFxbfFxcXSIsICIiLCB1bmxpc3QoYWdncmVnYXRlZF9yZXN1bHRzXzEzW24sIDEzXSkpLCAiLCAiKQogIAogIE5vaXN5SW5mb3JtZWQ0X3Bvc19zZXQxMyA8LSBzdHJzcGxpdChnc3ViKCJcXFt8XFxdIiwgIiIsIHVubGlzdChhZ2dyZWdhdGVkX3Jlc3VsdHNfMTNbbiwgMTVdKSksICIsICIpCiAgCiAgTm9pc3lJbmZvcm1lZDVfcG9zX3NldDEzIDwtIHN0cnNwbGl0KGdzdWIoIlxcW3xcXF0iLCAiIiwgdW5saXN0KGFnZ3JlZ2F0ZWRfcmVzdWx0c18xM1tuLCAxN10pKSwgIiwgIikKICAKICBOb2lzeUluZm9ybWVkNl9wb3Nfc2V0MTMgPC0gc3Ryc3BsaXQoZ3N1YigiXFxbfFxcXSIsICIiLCB1bmxpc3QoYWdncmVnYXRlZF9yZXN1bHRzXzEzW24sIDE5XSkpLCAiLCAiKQogIAogICMgTG9vcCB0aHJvdWdoIGVhY2ggcG9zaXRpb24gKGkpCiAgZm9yIChpIGluIDE6MTAwKSB7CiAgICAjIEV4dHJhY3QgVHJ1ZSBhbmQgRXhwZWN0ZWQgdmFsdWVzIGZvciB0aGUgaS10aCBwb3NpdGlvbgogICAgTU1fcG9zIDwtIHNhcHBseShNTV9wb3Nfc2V0MTMsIGZ1bmN0aW9uKHgpIGFzLm51bWVyaWMoeFtpXSkpCiAgICBOb2lzeUluZm9ybWVkMV9wb3MgPC0gc2FwcGx5KE5vaXN5SW5mb3JtZWQxX3Bvc19zZXQxMywgZnVuY3Rpb24oeCkgYXMubnVtZXJpYyh4W2ldKSkKICAgIE5vaXN5SW5mb3JtZWQyX3BvcyA8LSBzYXBwbHkoTm9pc3lJbmZvcm1lZDJfcG9zX3NldDEzLCBmdW5jdGlvbih4KSBhcy5udW1lcmljKHhbaV0pKQogICAgTm9pc3lJbmZvcm1lZDNfcG9zIDwtIHNhcHBseShOb2lzeUluZm9ybWVkM19wb3Nfc2V0MTMsIGZ1bmN0aW9uKHgpIGFzLm51bWVyaWMoeFtpXSkpCiAgICBOb2lzeUluZm9ybWVkNF9wb3MgPC0gc2FwcGx5KE5vaXN5SW5mb3JtZWQ0X3Bvc19zZXQxMywgZnVuY3Rpb24oeCkgYXMubnVtZXJpYyh4W2ldKSkKICAgIE5vaXN5SW5mb3JtZWQ1X3BvcyA8LSBzYXBwbHkoTm9pc3lJbmZvcm1lZDVfcG9zX3NldDEzLCBmdW5jdGlvbih4KSBhcy5udW1lcmljKHhbaV0pKQogICAgTm9pc3lJbmZvcm1lZDZfcG9zIDwtIHNhcHBseShOb2lzeUluZm9ybWVkNl9wb3Nfc2V0MTMsIGZ1bmN0aW9uKHgpIGFzLm51bWVyaWMoeFtpXSkpCiAgICAKICAgICMgQ2FsY3VsYXRlIHRoZSBhdmVyYWdlIG9mIFRydWUgYW5kIEV4cGVjdGVkIHZhbHVlcyBmb3IgdGhlIGktdGggcG9zaXRpb24KICAgIGF2ZXJhZ2VfTU1fcG9zW2ksIG5dIDwtIG1lYW4oTU1fcG9zLCBuYS5ybSA9IFRSVUUpCiAgICBhdmVyYWdlX05vaXN5SW5mb3JtZWQxX3Bvc1tpLCBuXSA8LSBtZWFuKE5vaXN5SW5mb3JtZWQxX3BvcywgbmEucm0gPSBUUlVFKQogICAgYXZlcmFnZV9Ob2lzeUluZm9ybWVkMl9wb3NbaSwgbl0gPC0gbWVhbihOb2lzeUluZm9ybWVkMl9wb3MsIG5hLnJtID0gVFJVRSkKICAgIGF2ZXJhZ2VfTm9pc3lJbmZvcm1lZDNfcG9zW2ksIG5dIDwtIG1lYW4oTm9pc3lJbmZvcm1lZDNfcG9zLCBuYS5ybSA9IFRSVUUpCiAgICBhdmVyYWdlX05vaXN5SW5mb3JtZWQ0X3Bvc1tpLCBuXSA8LSBtZWFuKE5vaXN5SW5mb3JtZWQ0X3BvcywgbmEucm0gPSBUUlVFKQogICAgYXZlcmFnZV9Ob2lzeUluZm9ybWVkNV9wb3NbaSwgbl0gPC0gbWVhbihOb2lzeUluZm9ybWVkNV9wb3MsIG5hLnJtID0gVFJVRSkKICAgIGF2ZXJhZ2VfTm9pc3lJbmZvcm1lZDZfcG9zW2ksIG5dIDwtIG1lYW4oTm9pc3lJbmZvcm1lZDZfcG9zLCBuYS5ybSA9IFRSVUUpCiAgfQp9CgojIENhbGN1bGF0ZSB0aGUgb3ZlcmFsbCBhdmVyYWdlIGZvciBlYWNoIHBvc2l0aW9uIGFjcm9zcyBhbGwgc2ltdWxhdGlvbnMKb3ZlcmFsbF9hdmVyYWdlX01NX3BvcyA8LSByb3dNZWFucyhhdmVyYWdlX01NX3BvcywgbmEucm0gPSBUUlVFKQpvdmVyYWxsX2F2ZXJhZ2VfTm9pc3lJbmZvcm1lZDFfcG9zIDwtIHJvd01lYW5zKGF2ZXJhZ2VfTm9pc3lJbmZvcm1lZDFfcG9zLCBuYS5ybSA9IFRSVUUpCm92ZXJhbGxfYXZlcmFnZV9Ob2lzeUluZm9ybWVkMl9wb3MgPC0gcm93TWVhbnMoYXZlcmFnZV9Ob2lzeUluZm9ybWVkMl9wb3MsIG5hLnJtID0gVFJVRSkKb3ZlcmFsbF9hdmVyYWdlX05vaXN5SW5mb3JtZWQzX3BvcyA8LSByb3dNZWFucyhhdmVyYWdlX05vaXN5SW5mb3JtZWQzX3BvcywgbmEucm0gPSBUUlVFKQpvdmVyYWxsX2F2ZXJhZ2VfTm9pc3lJbmZvcm1lZDRfcG9zIDwtIHJvd01lYW5zKGF2ZXJhZ2VfTm9pc3lJbmZvcm1lZDRfcG9zLCBuYS5ybSA9IFRSVUUpCm92ZXJhbGxfYXZlcmFnZV9Ob2lzeUluZm9ybWVkNV9wb3MgPC0gcm93TWVhbnMoYXZlcmFnZV9Ob2lzeUluZm9ybWVkNV9wb3MsIG5hLnJtID0gVFJVRSkKb3ZlcmFsbF9hdmVyYWdlX05vaXN5SW5mb3JtZWQ2X3BvcyA8LSByb3dNZWFucyhhdmVyYWdlX05vaXN5SW5mb3JtZWQ2X3BvcywgbmEucm0gPSBUUlVFKQoKIyBQbG90IHRoZSBvdmVyYWxsIGF2ZXJhZ2VzCnBsb3Qob3ZlcmFsbF9hdmVyYWdlX01NX3BvcywgdHlwZSA9ICJsIiwgcGNoID0gMTYsIGNvbCA9ICJibGFjayIsIG1haW4gPSAiT3ZlcmFsbCBBdmVyYWdlIFBvc2l0aW9uIiwgeGxhYiA9ICJQb3NpdGlvbiBpbiBMaXN0IiwgeWxhYiA9ICJWYWx1ZSIsIHlsaW0gPSBjKG1pbihjKG92ZXJhbGxfYXZlcmFnZV9NTV9wb3MsIG92ZXJhbGxfYXZlcmFnZV9TdG9jaE5vaXN5MV9wb3MsIG92ZXJhbGxfYXZlcmFnZV9Ob2lzeUluZm9ybWVkMl9wb3MsIG92ZXJhbGxfYXZlcmFnZV9Ob2lzeUluZm9ybWVkM19wb3MsIG92ZXJhbGxfYXZlcmFnZV9Ob2lzeUluZm9ybWVkNF9wb3MsIG92ZXJhbGxfYXZlcmFnZV9Ob2lzeUluZm9ybWVkNV9wb3MsIG92ZXJhbGxfYXZlcmFnZV9Ob2lzeUluZm9ybWVkNl9wb3MpKSwgbWF4KGMob3ZlcmFsbF9hdmVyYWdlX01NX3Bvcywgb3ZlcmFsbF9hdmVyYWdlX05vaXN5SW5mb3JtZWQxX3Bvcywgb3ZlcmFsbF9hdmVyYWdlX05vaXN5SW5mb3JtZWQyX3Bvcywgb3ZlcmFsbF9hdmVyYWdlX05vaXN5SW5mb3JtZWQzX3Bvcywgb3ZlcmFsbF9hdmVyYWdlX05vaXN5SW5mb3JtZWQ0X3Bvcywgb3ZlcmFsbF9hdmVyYWdlX05vaXN5SW5mb3JtZWQ1X3Bvcywgb3ZlcmFsbF9hdmVyYWdlX05vaXN5SW5mb3JtZWQ2X3BvcykpKSkKbGluZXMob3ZlcmFsbF9hdmVyYWdlX05vaXN5SW5mb3JtZWQxX3BvcywgdHlwZSA9ICJsIiwgcGNoID0gMTYsIGNvbCA9ICJyZWQiKQpsaW5lcyhvdmVyYWxsX2F2ZXJhZ2VfTm9pc3lJbmZvcm1lZDJfcG9zLCB0eXBlID0gImwiLCBwY2ggPSAxNiwgY29sID0gImdyZWVuIikKbGluZXMob3ZlcmFsbF9hdmVyYWdlX05vaXN5SW5mb3JtZWQzX3BvcywgdHlwZSA9ICJsIiwgcGNoID0gMTYsIGNvbCA9ICJ5ZWxsb3ciKQpsaW5lcyhvdmVyYWxsX2F2ZXJhZ2VfTm9pc3lJbmZvcm1lZDRfcG9zLCB0eXBlID0gImwiLCBwY2ggPSAxNiwgY29sID0gImJsdWUiKQpsaW5lcyhvdmVyYWxsX2F2ZXJhZ2VfTm9pc3lJbmZvcm1lZDVfcG9zLCB0eXBlID0gImwiLCBwY2ggPSAxNiwgY29sID0gInB1cnBsZSIpCmxpbmVzKG92ZXJhbGxfYXZlcmFnZV9Ob2lzeUluZm9ybWVkNl9wb3MsIHR5cGUgPSAibCIsIHBjaCA9IDE2LCBjb2wgPSAib3JhbmdlIikKCiMgQWRkIGxlZ2VuZApsZWdlbmQoInRvcGxlZnQiLCBsZWdlbmQgPSBjKCJNYXJrZXQgTWFrZXIiLCAiTm9pc3kgSW5mb3JtZWQgMSIsICJOb2lzeSBJbmZvcm1lZCAyIiwgIk5vaXN5IEluZm9ybWVkIDMiLCAiTm9pc3kgSW5mb3JtZWQgNCIsICJOb2lzeSBJbmZvcm1lZCA1IiwgIk5vaXN5IEluZm9ybWVkIDYiKSwgY29sID0gYygiYmxhY2siLCAicmVkIiwgImdyZWVuIiwgInllbGxvdyIsICJibHVlIiwgInB1cnBsZSIsICJvcmFuZ2UiKSwgbHR5ID0gMSwgY2V4ID0gMC44KQpgYGAKCgoKIyMgc2V0MTQgKDEgaW5mb3JtZWQgKyAyIG5vaXN5IGluZm9ybWVkICsgMiBub2lzeSArIDEgbWVhbiByZXZlcnNpb24pCgpgYGB7cn0KIyBJbml0aWFsaXplIG1hdHJpY2VzIHRvIHN0b3JlIGF2ZXJhZ2VzIGZvciBlYWNoIHBvc2l0aW9uCmF2ZXJhZ2VfYmlkIDwtIG1hdHJpeChOQSwgbnJvdyA9IDEwMCwgbmNvbCA9IDEwKQphdmVyYWdlX2FzayA8LSBtYXRyaXgoTkEsIG5yb3cgPSAxMDAsIG5jb2wgPSAxMCkKCiMgTG9vcCB0aHJvdWdoIGVhY2ggc2ltdWxhdGlvbiAobikKZm9yIChuIGluIDE6MTApIHsKICAjIEV4dHJhY3QgVHJ1ZSB2YWx1ZXMgZnJvbSB0aGUgYWdncmVnYXRlZF9yZXN1bHRzXzQgZGF0YWZyYW1lCiAgQmlkc19zZXQxNCA8LSBzdHJzcGxpdChnc3ViKCJcXFt8XFxdIiwgIiIsIHVubGlzdChhZ2dyZWdhdGVkX3Jlc3VsdHNfMTRbbiwgNF0pKSwgIiwgIikKICAKICAjIEV4dHJhY3QgRXhwZWN0ZWQgdmFsdWVzIGZyb20gdGhlIGFnZ3JlZ2F0ZWRfcmVzdWx0c180IGRhdGFmcmFtZQogIEFza3Nfc2V0MTQgPC0gc3Ryc3BsaXQoZ3N1YigiXFxbfFxcXSIsICIiLCB1bmxpc3QoYWdncmVnYXRlZF9yZXN1bHRzXzE0W24sIDVdKSksICIsICIpCiAgCiAgIyBMb29wIHRocm91Z2ggZWFjaCBwb3NpdGlvbiAoaSkKICBmb3IgKGkgaW4gMToxMDApIHsKICAgICMgRXh0cmFjdCBUcnVlIGFuZCBFeHBlY3RlZCB2YWx1ZXMgZm9yIHRoZSBpLXRoIHBvc2l0aW9uCiAgICBCaWRzIDwtIHNhcHBseShCaWRzX3NldDE0LCBmdW5jdGlvbih4KSBhcy5udW1lcmljKHhbaV0pKQogICAgQXNrcyA8LSBzYXBwbHkoQXNrc19zZXQxNCwgZnVuY3Rpb24oeCkgYXMubnVtZXJpYyh4W2ldKSkKICAgIAogICAgIyBDYWxjdWxhdGUgdGhlIGF2ZXJhZ2Ugb2YgVHJ1ZSBhbmQgRXhwZWN0ZWQgdmFsdWVzIGZvciB0aGUgaS10aCBwb3NpdGlvbgogICAgYXZlcmFnZV9iaWRbaSwgbl0gPC0gbWVhbihCaWRzLCBuYS5ybSA9IFRSVUUpCiAgICBhdmVyYWdlX2Fza1tpLCBuXSA8LSBtZWFuKEFza3MsIG5hLnJtID0gVFJVRSkKICB9Cn0KCiMgQ2FsY3VsYXRlIHRoZSBvdmVyYWxsIGF2ZXJhZ2UgZm9yIGVhY2ggcG9zaXRpb24gYWNyb3NzIGFsbCBzaW11bGF0aW9ucwpvdmVyYWxsX2F2ZXJhZ2VfYmlkIDwtIHJvd01lYW5zKGF2ZXJhZ2VfYmlkLCBuYS5ybSA9IFRSVUUpCm92ZXJhbGxfYXZlcmFnZV9hc2sgPC0gcm93TWVhbnMoYXZlcmFnZV9hc2ssIG5hLnJtID0gVFJVRSkKCiMjIFRydWUgVmFsdWUKIyBJbml0aWFsaXplIG1hdHJpY2VzIHRvIHN0b3JlIGF2ZXJhZ2VzIGZvciBlYWNoIHBvc2l0aW9uCmF2ZXJhZ2VfdHJ1ZSA8LSBtYXRyaXgoTkEsIG5yb3cgPSAxMDAsIG5jb2wgPSAxMCkKYXZlcmFnZV9leHBlY3RlZCA8LSBtYXRyaXgoTkEsIG5yb3cgPSAxMDAsIG5jb2wgPSAxMCkKCiMgTG9vcCB0aHJvdWdoIGVhY2ggc2ltdWxhdGlvbiAobikKZm9yIChuIGluIDE6MTApIHsKICAjIEV4dHJhY3QgVHJ1ZSB2YWx1ZXMgZnJvbSB0aGUgYWdncmVnYXRlZF9yZXN1bHRzXzQgZGF0YWZyYW1lCiAgVHJ1ZVZhbHVlc19zZXQxNCA8LSBzdHJzcGxpdChnc3ViKCJcXFt8XFxdIiwgIiIsIHVubGlzdChhZ2dyZWdhdGVkX3Jlc3VsdHNfMTRbbiwgMl0pKSwgIiwgIikKICAKICAjIEV4dHJhY3QgRXhwZWN0ZWQgdmFsdWVzIGZyb20gdGhlIGFnZ3JlZ2F0ZWRfcmVzdWx0c180IGRhdGFmcmFtZQogIEV4cGVjdGVkVmFsdWVzX3NldDE0IDwtIHN0cnNwbGl0KGdzdWIoIlxcW3xcXF0iLCAiIiwgdW5saXN0KGFnZ3JlZ2F0ZWRfcmVzdWx0c18xNFtuLCAzXSkpLCAiLCAiKQogIAogICMgTG9vcCB0aHJvdWdoIGVhY2ggcG9zaXRpb24gKGkpCiAgZm9yIChpIGluIDE6MTAwKSB7CiAgICAjIEV4dHJhY3QgVHJ1ZSBhbmQgRXhwZWN0ZWQgdmFsdWVzIGZvciB0aGUgaS10aCBwb3NpdGlvbgogICAgVHJ1ZV92YWx1ZXMgPC0gc2FwcGx5KFRydWVWYWx1ZXNfc2V0MTQsIGZ1bmN0aW9uKHgpIGFzLm51bWVyaWMoeFtpXSkpCiAgICBFeHBlY3RlZF92YWx1ZXMgPC0gc2FwcGx5KEV4cGVjdGVkVmFsdWVzX3NldDE0LCBmdW5jdGlvbih4KSBhcy5udW1lcmljKHhbaV0pKQogICAgCiAgICAjIENhbGN1bGF0ZSB0aGUgYXZlcmFnZSBvZiBUcnVlIGFuZCBFeHBlY3RlZCB2YWx1ZXMgZm9yIHRoZSBpLXRoIHBvc2l0aW9uCiAgICBhdmVyYWdlX3RydWVbaSwgbl0gPC0gbWVhbihUcnVlX3ZhbHVlcywgbmEucm0gPSBUUlVFKQogICAgYXZlcmFnZV9leHBlY3RlZFtpLCBuXSA8LSBtZWFuKEV4cGVjdGVkX3ZhbHVlcywgbmEucm0gPSBUUlVFKQogIH0KfQoKIyBDYWxjdWxhdGUgdGhlIG92ZXJhbGwgYXZlcmFnZSBmb3IgZWFjaCBwb3NpdGlvbiBhY3Jvc3MgYWxsIHNpbXVsYXRpb25zCm92ZXJhbGxfYXZlcmFnZV90cnVlIDwtIHJvd01lYW5zKGF2ZXJhZ2VfdHJ1ZSwgbmEucm0gPSBUUlVFKQpvdmVyYWxsX2F2ZXJhZ2VfZXhwZWN0ZWQgPC0gcm93TWVhbnMoYXZlcmFnZV9leHBlY3RlZCwgbmEucm0gPSBUUlVFKQoKIyBQbG90IHRoZSBvdmVyYWxsIGF2ZXJhZ2VzCiNwbG90KG92ZXJhbGxfYXZlcmFnZV90cnVlLCB0eXBlID0gImwiLCBwY2ggPSAxNiwgY29sID0gImJsdWUiLCBtYWluID0gIk92ZXJhbGwgQXZlcmFnZSBvZiBUcnVlIHZzIEV4cGVjdGVkIFZhbHVlcyIsIHhsYWIgPSAiUG9zaXRpb24gaW4gTGlzdCIsIHlsYWIgPSAiVmFsdWUiLCB5bGltID0gYyhtaW4oYyhvdmVyYWxsX2F2ZXJhZ2VfdHJ1ZSwgb3ZlcmFsbF9hdmVyYWdlX2V4cGVjdGVkKSksIG1heChjKG92ZXJhbGxfYXZlcmFnZV90cnVlLCBvdmVyYWxsX2F2ZXJhZ2VfZXhwZWN0ZWQpKSkpCiNsaW5lcyhvdmVyYWxsX2F2ZXJhZ2VfZXhwZWN0ZWQsIHR5cGUgPSAibCIsIHBjaCA9IDE2LCBjb2wgPSAicmVkIikKI2xlZ2VuZCgidG9wcmlnaHQiLCBsZWdlbmQgPSBjKCJUcnVlIFZhbHVlcyIsICJFeHBlY3RlZCBWYWx1ZXMiKSwgY29sID0gYygiYmx1ZSIsICJyZWQiKSwgbHR5ID0gMSwgY2V4ID0gMC44KQoKIyBQbG90IHRoZSBvdmVyYWxsIGF2ZXJhZ2VzCnBsb3Qob3ZlcmFsbF9hdmVyYWdlX2JpZCwgdHlwZSA9ICJsIiwgcGNoID0gMTYsIGNvbCA9ICJibHVlIiwgbWFpbiA9ICJPdmVyYWxsIEF2ZXJhZ2Ugb2YgQmlkcyB2cyBBc2tzICYgVHJ1ZSB2cyBFeHBlY3RlZCBWYWx1ZXMiLCB4bGFiID0gIlBvc2l0aW9uIGluIExpc3QiLCB5bGFiID0gIlZhbHVlIiwgeWxpbSA9IGMobWluKGMob3ZlcmFsbF9hdmVyYWdlX2JpZCwgb3ZlcmFsbF9hdmVyYWdlX2Fzaywgb3ZlcmFsbF9hdmVyYWdlX3RydWUsIG92ZXJhbGxfYXZlcmFnZV9leHBlY3RlZCkpLCBtYXgoYyhvdmVyYWxsX2F2ZXJhZ2VfYmlkLCBvdmVyYWxsX2F2ZXJhZ2VfYXNrLCBvdmVyYWxsX2F2ZXJhZ2VfdHJ1ZSwgb3ZlcmFsbF9hdmVyYWdlX2V4cGVjdGVkKSkpKQpsaW5lcyhvdmVyYWxsX2F2ZXJhZ2VfYXNrLCB0eXBlID0gImwiLCBwY2ggPSAxNiwgY29sID0gInJlZCIpCmxpbmVzKG92ZXJhbGxfYXZlcmFnZV90cnVlLCB0eXBlID0gImwiLCBwY2ggPSAxNiwgY29sID0gImdyZWVuIikKbGluZXMob3ZlcmFsbF9hdmVyYWdlX2V4cGVjdGVkLCB0eXBlID0gImwiLCBwY2ggPSAxNiwgY29sID0gInB1cnBsZSIpCmxlZ2VuZCgiYm90dG9tbGVmdCIsIGxlZ2VuZCA9IGMoIkJpZHMiLCAiQXNrcyIsICJUcnVlIFZhbHVlIiwgIkV4cGVjdGVkIFZhbHVlIiksIGNvbCA9IGMoImJsdWUiLCAicmVkIiwgImdyZWVuIiwgInB1cnBsZSIpLCBsdHkgPSAxLCBjZXggPSAwLjgpCmBgYAoKYGBge3J9CiMgSW5pdGlhbGl6ZSBtYXRyaWNlcyB0byBzdG9yZSBhdmVyYWdlcyBmb3IgZWFjaCBwb3NpdGlvbgphdmVyYWdlX01NX3BubCA8LSBtYXRyaXgoTkEsIG5yb3cgPSAxMDAsIG5jb2wgPSAxMCkKYXZlcmFnZV9JbmZvcm1lZF9wbmwgPC0gbWF0cml4KE5BLCBucm93ID0gMTAwLCBuY29sID0gMTApCmF2ZXJhZ2VfTm9pc3lJbmZvcm1lZDFfcG5sIDwtIG1hdHJpeChOQSwgbnJvdyA9IDEwMCwgbmNvbCA9IDEwKQphdmVyYWdlX05vaXN5SW5mb3JtZWQyX3BubCA8LSBtYXRyaXgoTkEsIG5yb3cgPSAxMDAsIG5jb2wgPSAxMCkKYXZlcmFnZV9Ob2lzeTFfcG5sIDwtIG1hdHJpeChOQSwgbnJvdyA9IDEwMCwgbmNvbCA9IDEwKQphdmVyYWdlX05vaXN5Ml9wbmwgPC0gbWF0cml4KE5BLCBucm93ID0gMTAwLCBuY29sID0gMTApCmF2ZXJhZ2VfbXJfcG5sIDwtIG1hdHJpeChOQSwgbnJvdyA9IDEwMCwgbmNvbCA9IDEwKQoKIyBMb29wIHRocm91Z2ggZWFjaCBzaW11bGF0aW9uIChuKQpmb3IgKG4gaW4gMToxMCkgewoKICBNTV9wbmxfc2V0MTQgPC0gc3Ryc3BsaXQoZ3N1YigiXFxbfFxcXSIsICIiLCB1bmxpc3QoYWdncmVnYXRlZF9yZXN1bHRzXzE0W24sIDZdKSksICIsICIpCgogIEluZm9ybWVkX3BubF9zZXQxNCA8LSBzdHJzcGxpdChnc3ViKCJcXFt8XFxdIiwgIiIsIHVubGlzdChhZ2dyZWdhdGVkX3Jlc3VsdHNfMTRbbiwgOF0pKSwgIiwgIikKICAKICBOb2lzeUluZm9ybWVkMV9wbmxfc2V0MTQgPC0gc3Ryc3BsaXQoZ3N1YigiXFxbfFxcXSIsICIiLCB1bmxpc3QoYWdncmVnYXRlZF9yZXN1bHRzXzE0W24sIDEwXSkpLCAiLCAiKQogIAogIE5vaXN5SW5mb3JtZWQyX3BubF9zZXQxNCA8LSBzdHJzcGxpdChnc3ViKCJcXFt8XFxdIiwgIiIsIHVubGlzdChhZ2dyZWdhdGVkX3Jlc3VsdHNfMTRbbiwgMTJdKSksICIsICIpCiAgCiAgTm9pc3kxX3BubF9zZXQxNCA8LSBzdHJzcGxpdChnc3ViKCJcXFt8XFxdIiwgIiIsIHVubGlzdChhZ2dyZWdhdGVkX3Jlc3VsdHNfMTRbbiwgMTRdKSksICIsICIpCiAgCiAgTm9pc3kyX3BubF9zZXQxNCA8LSBzdHJzcGxpdChnc3ViKCJcXFt8XFxdIiwgIiIsIHVubGlzdChhZ2dyZWdhdGVkX3Jlc3VsdHNfMTRbbiwgMTZdKSksICIsICIpCiAgCiAgbXJfcG5sX3NldDE0IDwtIHN0cnNwbGl0KGdzdWIoIlxcW3xcXF0iLCAiIiwgdW5saXN0KGFnZ3JlZ2F0ZWRfcmVzdWx0c18xNFtuLCAxOF0pKSwgIiwgIikKICAKICAjIExvb3AgdGhyb3VnaCBlYWNoIHBvc2l0aW9uIChpKQogIGZvciAoaSBpbiAxOjEwMCkgewogICAgIyBFeHRyYWN0IFRydWUgYW5kIEV4cGVjdGVkIHZhbHVlcyBmb3IgdGhlIGktdGggcG9zaXRpb24KICAgIE1NX3BubCA8LSBzYXBwbHkoTU1fcG5sX3NldDE0LCBmdW5jdGlvbih4KSBhcy5udW1lcmljKHhbaV0pKQogICAgSW5mb3JtZWRfcG5sIDwtIHNhcHBseShJbmZvcm1lZF9wbmxfc2V0MTQsIGZ1bmN0aW9uKHgpIGFzLm51bWVyaWMoeFtpXSkpCiAgICBOb2lzeUluZm9ybWVkMV9wbmwgPC0gc2FwcGx5KE5vaXN5SW5mb3JtZWQxX3BubF9zZXQxNCwgZnVuY3Rpb24oeCkgYXMubnVtZXJpYyh4W2ldKSkKICAgIE5vaXN5SW5mb3JtZWQyX3BubCA8LSBzYXBwbHkoTm9pc3lJbmZvcm1lZDJfcG5sX3NldDE0LCBmdW5jdGlvbih4KSBhcy5udW1lcmljKHhbaV0pKQogICAgTm9pc3kxX3BubCA8LSBzYXBwbHkoTm9pc3kxX3BubF9zZXQxNCwgZnVuY3Rpb24oeCkgYXMubnVtZXJpYyh4W2ldKSkKICAgIE5vaXN5Ml9wbmwgPC0gc2FwcGx5KE5vaXN5Ml9wbmxfc2V0MTQsIGZ1bmN0aW9uKHgpIGFzLm51bWVyaWMoeFtpXSkpCiAgICBtcl9wbmwgPC0gc2FwcGx5KG1yX3BubF9zZXQxNCwgZnVuY3Rpb24oeCkgYXMubnVtZXJpYyh4W2ldKSkKICAgIAogICAgIyBDYWxjdWxhdGUgdGhlIGF2ZXJhZ2Ugb2YgVHJ1ZSBhbmQgRXhwZWN0ZWQgdmFsdWVzIGZvciB0aGUgaS10aCBwb3NpdGlvbgogICAgYXZlcmFnZV9NTV9wbmxbaSwgbl0gPC0gbWVhbihNTV9wbmwsIG5hLnJtID0gVFJVRSkKICAgIGF2ZXJhZ2VfSW5mb3JtZWRfcG5sW2ksIG5dIDwtIG1lYW4oSW5mb3JtZWRfcG5sLCBuYS5ybSA9IFRSVUUpCiAgICBhdmVyYWdlX05vaXN5SW5mb3JtZWQxX3BubFtpLCBuXSA8LSBtZWFuKE5vaXN5SW5mb3JtZWQxX3BubCwgbmEucm0gPSBUUlVFKQogICAgYXZlcmFnZV9Ob2lzeUluZm9ybWVkMl9wbmxbaSwgbl0gPC0gbWVhbihOb2lzeUluZm9ybWVkMl9wbmwsIG5hLnJtID0gVFJVRSkKICAgIGF2ZXJhZ2VfTm9pc3kxX3BubFtpLCBuXSA8LSBtZWFuKE5vaXN5MV9wbmwsIG5hLnJtID0gVFJVRSkKICAgIGF2ZXJhZ2VfTm9pc3kyX3BubFtpLCBuXSA8LSBtZWFuKE5vaXN5Ml9wbmwsIG5hLnJtID0gVFJVRSkKICAgIGF2ZXJhZ2VfbXJfcG5sW2ksIG5dIDwtIG1lYW4obXJfcG5sLCBuYS5ybSA9IFRSVUUpCiAgfQp9CgojIENhbGN1bGF0ZSB0aGUgb3ZlcmFsbCBhdmVyYWdlIGZvciBlYWNoIHBvc2l0aW9uIGFjcm9zcyBhbGwgc2ltdWxhdGlvbnMKb3ZlcmFsbF9hdmVyYWdlX01NX3BubCA8LSByb3dNZWFucyhhdmVyYWdlX01NX3BubCwgbmEucm0gPSBUUlVFKQpvdmVyYWxsX2F2ZXJhZ2VfSW5mb3JtZWRfcG5sIDwtIHJvd01lYW5zKGF2ZXJhZ2VfSW5mb3JtZWRfcG5sLCBuYS5ybSA9IFRSVUUpCm92ZXJhbGxfYXZlcmFnZV9Ob2lzeUluZm9ybWVkMV9wbmwgPC0gcm93TWVhbnMoYXZlcmFnZV9Ob2lzeUluZm9ybWVkMV9wbmwsIG5hLnJtID0gVFJVRSkKb3ZlcmFsbF9hdmVyYWdlX05vaXN5SW5mb3JtZWQyX3BubCA8LSByb3dNZWFucyhhdmVyYWdlX05vaXN5SW5mb3JtZWQyX3BubCwgbmEucm0gPSBUUlVFKQpvdmVyYWxsX2F2ZXJhZ2VfTm9pc3kxX3BubCA8LSByb3dNZWFucyhhdmVyYWdlX05vaXN5MV9wbmwsIG5hLnJtID0gVFJVRSkKb3ZlcmFsbF9hdmVyYWdlX05vaXN5Ml9wbmwgPC0gcm93TWVhbnMoYXZlcmFnZV9Ob2lzeTJfcG5sLCBuYS5ybSA9IFRSVUUpCm92ZXJhbGxfYXZlcmFnZV9tcl9wbmwgPC0gcm93TWVhbnMoYXZlcmFnZV9tcl9wbmwsIG5hLnJtID0gVFJVRSkKCiMgUGxvdCB0aGUgb3ZlcmFsbCBhdmVyYWdlcwpwbG90KG92ZXJhbGxfYXZlcmFnZV9NTV9wbmwsIHR5cGUgPSAibCIsIHBjaCA9IDE2LCBjb2wgPSAiYmxhY2siLCBtYWluID0gIk92ZXJhbGwgQXZlcmFnZSBQTkwiLCB4bGFiID0gIlBvc2l0aW9uIGluIExpc3QiLCB5bGFiID0gIlZhbHVlIiwgeWxpbSA9IGMobWluKGMob3ZlcmFsbF9hdmVyYWdlX01NX3BubCwgb3ZlcmFsbF9hdmVyYWdlX0luZm9ybWVkX3BubCwgb3ZlcmFsbF9hdmVyYWdlX05vaXN5SW5mb3JtZWQxX3BubCwgb3ZlcmFsbF9hdmVyYWdlX05vaXN5SW5mb3JtZWQyX3BubCwgb3ZlcmFsbF9hdmVyYWdlX05vaXN5MV9wbmwsIG92ZXJhbGxfYXZlcmFnZV9Ob2lzeTJfcG5sLCBvdmVyYWxsX2F2ZXJhZ2VfbXJfcG5sKSksIG1heChjKG92ZXJhbGxfYXZlcmFnZV9NTV9wbmwsIG92ZXJhbGxfYXZlcmFnZV9JbmZvcm1lZF9wbmwsIG92ZXJhbGxfYXZlcmFnZV9Ob2lzeUluZm9ybWVkMV9wbmwsIG92ZXJhbGxfYXZlcmFnZV9Ob2lzeUluZm9ybWVkMl9wbmwsIG92ZXJhbGxfYXZlcmFnZV9Ob2lzeTFfcG5sLCBvdmVyYWxsX2F2ZXJhZ2VfTm9pc3kyX3BubCwgb3ZlcmFsbF9hdmVyYWdlX21yX3BubCkpKSkKbGluZXMob3ZlcmFsbF9hdmVyYWdlX0luZm9ybWVkX3BubCwgdHlwZSA9ICJsIiwgcGNoID0gMTYsIGNvbCA9ICJyZWQiKQpsaW5lcyhvdmVyYWxsX2F2ZXJhZ2VfTm9pc3lJbmZvcm1lZDFfcG5sLCB0eXBlID0gImwiLCBwY2ggPSAxNiwgY29sID0gImdyZWVuIikKbGluZXMob3ZlcmFsbF9hdmVyYWdlX05vaXN5SW5mb3JtZWQyX3BubCwgdHlwZSA9ICJsIiwgcGNoID0gMTYsIGNvbCA9ICJ5ZWxsb3ciKQpsaW5lcyhvdmVyYWxsX2F2ZXJhZ2VfTm9pc3kxX3BubCwgdHlwZSA9ICJsIiwgcGNoID0gMTYsIGNvbCA9ICJibHVlIikKbGluZXMob3ZlcmFsbF9hdmVyYWdlX05vaXN5Ml9wbmwsIHR5cGUgPSAibCIsIHBjaCA9IDE2LCBjb2wgPSAicHVycGxlIikKbGluZXMob3ZlcmFsbF9hdmVyYWdlX21yX3BubCwgdHlwZSA9ICJsIiwgcGNoID0gMTYsIGNvbCA9ICJvcmFuZ2UiKQoKIyBBZGQgbGVnZW5kCmxlZ2VuZCgiYm90dG9tbGVmdCIsIGxlZ2VuZCA9IGMoIk1hcmtldCBNYWtlciIsICJJbmZvcm1lZCIsICJOb2lzeSBJbmZvcm1lZCAxIiwgIk5vaXN5IEluZm9ybWVkIDIiLCAiTm9pc3kgMSIsICJOb2lzeSAyIiwgIk1lYW4gUmV2ZXJzaW9uIiksIGNvbCA9IGMoImJsYWNrIiwgInJlZCIsICJncmVlbiIsICJ5ZWxsb3ciLCAiYmx1ZSIsICJwdXJwbGUiLCAib3JhbmdlIiksIGx0eSA9IDEsIGNleCA9IDAuOCkKYGBgCgpgYGB7cn0KIyBJbml0aWFsaXplIG1hdHJpY2VzIHRvIHN0b3JlIGF2ZXJhZ2VzIGZvciBlYWNoIHBvc2l0aW9uCmF2ZXJhZ2VfTU1fcG9zIDwtIG1hdHJpeChOQSwgbnJvdyA9IDEwMCwgbmNvbCA9IDEwKQphdmVyYWdlX0luZm9ybWVkX3BvcyA8LSBtYXRyaXgoTkEsIG5yb3cgPSAxMDAsIG5jb2wgPSAxMCkKYXZlcmFnZV9Ob2lzeUluZm9ybWVkMV9wb3MgPC0gbWF0cml4KE5BLCBucm93ID0gMTAwLCBuY29sID0gMTApCmF2ZXJhZ2VfTm9pc3lJbmZvcm1lZDJfcG9zIDwtIG1hdHJpeChOQSwgbnJvdyA9IDEwMCwgbmNvbCA9IDEwKQphdmVyYWdlX05vaXN5MV9wb3MgPC0gbWF0cml4KE5BLCBucm93ID0gMTAwLCBuY29sID0gMTApCmF2ZXJhZ2VfTm9pc3kyX3BvcyA8LSBtYXRyaXgoTkEsIG5yb3cgPSAxMDAsIG5jb2wgPSAxMCkKYXZlcmFnZV9tcl9wb3MgPC0gbWF0cml4KE5BLCBucm93ID0gMTAwLCBuY29sID0gMTApCgojIExvb3AgdGhyb3VnaCBlYWNoIHNpbXVsYXRpb24gKG4pCmZvciAobiBpbiAxOjEwKSB7CgogIE1NX3Bvc19zZXQxNCA8LSBzdHJzcGxpdChnc3ViKCJcXFt8XFxdIiwgIiIsIHVubGlzdChhZ2dyZWdhdGVkX3Jlc3VsdHNfMTRbbiwgN10pKSwgIiwgIikKCiAgSW5mb3JtZWRfcG9zX3NldDE0IDwtIHN0cnNwbGl0KGdzdWIoIlxcW3xcXF0iLCAiIiwgdW5saXN0KGFnZ3JlZ2F0ZWRfcmVzdWx0c18xNFtuLCA5XSkpLCAiLCAiKQogIAogIE5vaXN5SW5mb3JtZWQxX3Bvc19zZXQxNCA8LSBzdHJzcGxpdChnc3ViKCJcXFt8XFxdIiwgIiIsIHVubGlzdChhZ2dyZWdhdGVkX3Jlc3VsdHNfMTRbbiwgMTFdKSksICIsICIpCiAgCiAgTm9pc3lJbmZvcm1lZDJfcG9zX3NldDE0IDwtIHN0cnNwbGl0KGdzdWIoIlxcW3xcXF0iLCAiIiwgdW5saXN0KGFnZ3JlZ2F0ZWRfcmVzdWx0c18xNFtuLCAxM10pKSwgIiwgIikKICAKICBOb2lzeTFfcG9zX3NldDE0IDwtIHN0cnNwbGl0KGdzdWIoIlxcW3xcXF0iLCAiIiwgdW5saXN0KGFnZ3JlZ2F0ZWRfcmVzdWx0c18xNFtuLCAxNV0pKSwgIiwgIikKICAKICBOb2lzeTJfcG9zX3NldDE0IDwtIHN0cnNwbGl0KGdzdWIoIlxcW3xcXF0iLCAiIiwgdW5saXN0KGFnZ3JlZ2F0ZWRfcmVzdWx0c18xNFtuLCAxN10pKSwgIiwgIikKICAKICBtcl9wb3Nfc2V0MTQgPC0gc3Ryc3BsaXQoZ3N1YigiXFxbfFxcXSIsICIiLCB1bmxpc3QoYWdncmVnYXRlZF9yZXN1bHRzXzE0W24sIDE5XSkpLCAiLCAiKQogIAogICMgTG9vcCB0aHJvdWdoIGVhY2ggcG9zaXRpb24gKGkpCiAgZm9yIChpIGluIDE6MTAwKSB7CiAgICAjIEV4dHJhY3QgVHJ1ZSBhbmQgRXhwZWN0ZWQgdmFsdWVzIGZvciB0aGUgaS10aCBwb3NpdGlvbgogICAgTU1fcG9zIDwtIHNhcHBseShNTV9wb3Nfc2V0MTQsIGZ1bmN0aW9uKHgpIGFzLm51bWVyaWMoeFtpXSkpCiAgICBJbmZvcm1lZF9wb3MgPC0gc2FwcGx5KEluZm9ybWVkX3Bvc19zZXQxNCwgZnVuY3Rpb24oeCkgYXMubnVtZXJpYyh4W2ldKSkKICAgIE5vaXN5SW5mb3JtZWQxX3BvcyA8LSBzYXBwbHkoTm9pc3lJbmZvcm1lZDFfcG9zX3NldDE0LCBmdW5jdGlvbih4KSBhcy5udW1lcmljKHhbaV0pKQogICAgTm9pc3lJbmZvcm1lZDJfcG9zIDwtIHNhcHBseShOb2lzeUluZm9ybWVkMl9wb3Nfc2V0MTQsIGZ1bmN0aW9uKHgpIGFzLm51bWVyaWMoeFtpXSkpCiAgICBOb2lzeTFfcG9zIDwtIHNhcHBseShOb2lzeTFfcG9zX3NldDE0LCBmdW5jdGlvbih4KSBhcy5udW1lcmljKHhbaV0pKQogICAgTm9pc3kyX3BvcyA8LSBzYXBwbHkoTm9pc3kyX3Bvc19zZXQxNCwgZnVuY3Rpb24oeCkgYXMubnVtZXJpYyh4W2ldKSkKICAgIG1yX3BvcyA8LSBzYXBwbHkobXJfcG9zX3NldDE0LCBmdW5jdGlvbih4KSBhcy5udW1lcmljKHhbaV0pKQogICAgCiAgICAjIENhbGN1bGF0ZSB0aGUgYXZlcmFnZSBvZiBUcnVlIGFuZCBFeHBlY3RlZCB2YWx1ZXMgZm9yIHRoZSBpLXRoIHBvc2l0aW9uCiAgICBhdmVyYWdlX01NX3Bvc1tpLCBuXSA8LSBtZWFuKE1NX3BvcywgbmEucm0gPSBUUlVFKQogICAgYXZlcmFnZV9JbmZvcm1lZF9wb3NbaSwgbl0gPC0gbWVhbihJbmZvcm1lZF9wb3MsIG5hLnJtID0gVFJVRSkKICAgIGF2ZXJhZ2VfTm9pc3lJbmZvcm1lZDFfcG9zW2ksIG5dIDwtIG1lYW4oTm9pc3lJbmZvcm1lZDFfcG9zLCBuYS5ybSA9IFRSVUUpCiAgICBhdmVyYWdlX05vaXN5SW5mb3JtZWQyX3Bvc1tpLCBuXSA8LSBtZWFuKE5vaXN5SW5mb3JtZWQyX3BvcywgbmEucm0gPSBUUlVFKQogICAgYXZlcmFnZV9Ob2lzeTFfcG9zW2ksIG5dIDwtIG1lYW4oTm9pc3kxX3BvcywgbmEucm0gPSBUUlVFKQogICAgYXZlcmFnZV9Ob2lzeTJfcG9zW2ksIG5dIDwtIG1lYW4oTm9pc3kyX3BvcywgbmEucm0gPSBUUlVFKQogICAgYXZlcmFnZV9tcl9wb3NbaSwgbl0gPC0gbWVhbihtcl9wb3MsIG5hLnJtID0gVFJVRSkKICB9Cn0KCiMgQ2FsY3VsYXRlIHRoZSBvdmVyYWxsIGF2ZXJhZ2UgZm9yIGVhY2ggcG9zaXRpb24gYWNyb3NzIGFsbCBzaW11bGF0aW9ucwpvdmVyYWxsX2F2ZXJhZ2VfTU1fcG9zIDwtIHJvd01lYW5zKGF2ZXJhZ2VfTU1fcG9zLCBuYS5ybSA9IFRSVUUpCm92ZXJhbGxfYXZlcmFnZV9JbmZvcm1lZF9wb3MgPC0gcm93TWVhbnMoYXZlcmFnZV9JbmZvcm1lZF9wb3MsIG5hLnJtID0gVFJVRSkKb3ZlcmFsbF9hdmVyYWdlX05vaXN5SW5mb3JtZWQxX3BvcyA8LSByb3dNZWFucyhhdmVyYWdlX05vaXN5SW5mb3JtZWQxX3BvcywgbmEucm0gPSBUUlVFKQpvdmVyYWxsX2F2ZXJhZ2VfTm9pc3lJbmZvcm1lZDJfcG9zIDwtIHJvd01lYW5zKGF2ZXJhZ2VfTm9pc3lJbmZvcm1lZDJfcG9zLCBuYS5ybSA9IFRSVUUpCm92ZXJhbGxfYXZlcmFnZV9Ob2lzeTFfcG9zIDwtIHJvd01lYW5zKGF2ZXJhZ2VfTm9pc3kxX3BvcywgbmEucm0gPSBUUlVFKQpvdmVyYWxsX2F2ZXJhZ2VfTm9pc3kyX3BvcyA8LSByb3dNZWFucyhhdmVyYWdlX05vaXN5Ml9wb3MsIG5hLnJtID0gVFJVRSkKb3ZlcmFsbF9hdmVyYWdlX21yX3BvcyA8LSByb3dNZWFucyhhdmVyYWdlX21yX3BvcywgbmEucm0gPSBUUlVFKQoKIyBQbG90IHRoZSBvdmVyYWxsIGF2ZXJhZ2VzCnBsb3Qob3ZlcmFsbF9hdmVyYWdlX01NX3BvcywgdHlwZSA9ICJsIiwgcGNoID0gMTYsIGNvbCA9ICJibGFjayIsIG1haW4gPSAiT3ZlcmFsbCBBdmVyYWdlIFBvc2l0aW9uIiwgeGxhYiA9ICJQb3NpdGlvbiBpbiBMaXN0IiwgeWxhYiA9ICJWYWx1ZSIsIHlsaW0gPSBjKG1pbihjKG92ZXJhbGxfYXZlcmFnZV9NTV9wb3MsIG92ZXJhbGxfYXZlcmFnZV9JbmZvcm1lZF9wb3MsIG92ZXJhbGxfYXZlcmFnZV9Ob2lzeUluZm9ybWVkMV9wb3MsIG92ZXJhbGxfYXZlcmFnZV9Ob2lzeUluZm9ybWVkMl9wb3MsIG92ZXJhbGxfYXZlcmFnZV9Ob2lzeTFfcG9zLCBvdmVyYWxsX2F2ZXJhZ2VfTm9pc3kyX3Bvcywgb3ZlcmFsbF9hdmVyYWdlX21yX3BvcykpLCBtYXgoYyhvdmVyYWxsX2F2ZXJhZ2VfTU1fcG9zLCBvdmVyYWxsX2F2ZXJhZ2VfSW5mb3JtZWRfcG9zLCBvdmVyYWxsX2F2ZXJhZ2VfTm9pc3lJbmZvcm1lZDFfcG9zLCBvdmVyYWxsX2F2ZXJhZ2VfTm9pc3lJbmZvcm1lZDJfcG9zLCBvdmVyYWxsX2F2ZXJhZ2VfTm9pc3kxX3Bvcywgb3ZlcmFsbF9hdmVyYWdlX05vaXN5Ml9wb3MsIG92ZXJhbGxfYXZlcmFnZV9tcl9wb3MpKSkpCmxpbmVzKG92ZXJhbGxfYXZlcmFnZV9JbmZvcm1lZF9wb3MsIHR5cGUgPSAibCIsIHBjaCA9IDE2LCBjb2wgPSAicmVkIikKbGluZXMob3ZlcmFsbF9hdmVyYWdlX05vaXN5SW5mb3JtZWQxX3BvcywgdHlwZSA9ICJsIiwgcGNoID0gMTYsIGNvbCA9ICJncmVlbiIpCmxpbmVzKG92ZXJhbGxfYXZlcmFnZV9Ob2lzeUluZm9ybWVkMl9wb3MsIHR5cGUgPSAibCIsIHBjaCA9IDE2LCBjb2wgPSAieWVsbG93IikKbGluZXMob3ZlcmFsbF9hdmVyYWdlX05vaXN5MV9wb3MsIHR5cGUgPSAibCIsIHBjaCA9IDE2LCBjb2wgPSAiYmx1ZSIpCmxpbmVzKG92ZXJhbGxfYXZlcmFnZV9Ob2lzeTJfcG9zLCB0eXBlID0gImwiLCBwY2ggPSAxNiwgY29sID0gInB1cnBsZSIpCmxpbmVzKG92ZXJhbGxfYXZlcmFnZV9tcl9wb3MsIHR5cGUgPSAibCIsIHBjaCA9IDE2LCBjb2wgPSAib3JhbmdlIikKCiMgQWRkIGxlZ2VuZApsZWdlbmQoImJvdHRvbWxlZnQiLCBsZWdlbmQgPSBjKCJNYXJrZXQgTWFrZXIiLCAiSW5mb3JtZWQiLCAiTm9pc3kgSW5mb3JtZWQgMSIsICJOb2lzeSBJbmZvcm1lZCAyIiwgIk5vaXN5IDEiLCAiTm9pc3kgMiIsICJNZWFuIFJldmVyc2lvbiIpLCBjb2wgPSBjKCJibGFjayIsICJyZWQiLCAiZ3JlZW4iLCAieWVsbG93IiwgImJsdWUiLCAicHVycGxlIiwgIm9yYW5nZSIpLCBsdHkgPSAxLCBjZXggPSAwLjgpCmBgYAoKCgojIyBzZXQxNSAgKDEgaW5mb3JtZWQgKyAyIG5vaXN5IGluZm9ybWVkICsgMiBub2lzeSArIDEgbW9ubWVudHVtKQoKYGBge3J9CiMgSW5pdGlhbGl6ZSBtYXRyaWNlcyB0byBzdG9yZSBhdmVyYWdlcyBmb3IgZWFjaCBwb3NpdGlvbgphdmVyYWdlX2JpZCA8LSBtYXRyaXgoTkEsIG5yb3cgPSAxMDAsIG5jb2wgPSAxMCkKYXZlcmFnZV9hc2sgPC0gbWF0cml4KE5BLCBucm93ID0gMTAwLCBuY29sID0gMTApCgojIExvb3AgdGhyb3VnaCBlYWNoIHNpbXVsYXRpb24gKG4pCmZvciAobiBpbiAxOjEwKSB7CiAgIyBFeHRyYWN0IFRydWUgdmFsdWVzIGZyb20gdGhlIGFnZ3JlZ2F0ZWRfcmVzdWx0c180IGRhdGFmcmFtZQogIEJpZHNfc2V0MTUgPC0gc3Ryc3BsaXQoZ3N1YigiXFxbfFxcXSIsICIiLCB1bmxpc3QoYWdncmVnYXRlZF9yZXN1bHRzXzE1W24sIDRdKSksICIsICIpCiAgCiAgIyBFeHRyYWN0IEV4cGVjdGVkIHZhbHVlcyBmcm9tIHRoZSBhZ2dyZWdhdGVkX3Jlc3VsdHNfNCBkYXRhZnJhbWUKICBBc2tzX3NldDE1IDwtIHN0cnNwbGl0KGdzdWIoIlxcW3xcXF0iLCAiIiwgdW5saXN0KGFnZ3JlZ2F0ZWRfcmVzdWx0c18xNVtuLCA1XSkpLCAiLCAiKQogIAogICMgTG9vcCB0aHJvdWdoIGVhY2ggcG9zaXRpb24gKGkpCiAgZm9yIChpIGluIDE6MTAwKSB7CiAgICAjIEV4dHJhY3QgVHJ1ZSBhbmQgRXhwZWN0ZWQgdmFsdWVzIGZvciB0aGUgaS10aCBwb3NpdGlvbgogICAgQmlkcyA8LSBzYXBwbHkoQmlkc19zZXQxNSwgZnVuY3Rpb24oeCkgYXMubnVtZXJpYyh4W2ldKSkKICAgIEFza3MgPC0gc2FwcGx5KEFza3Nfc2V0MTUsIGZ1bmN0aW9uKHgpIGFzLm51bWVyaWMoeFtpXSkpCiAgICAKICAgICMgQ2FsY3VsYXRlIHRoZSBhdmVyYWdlIG9mIFRydWUgYW5kIEV4cGVjdGVkIHZhbHVlcyBmb3IgdGhlIGktdGggcG9zaXRpb24KICAgIGF2ZXJhZ2VfYmlkW2ksIG5dIDwtIG1lYW4oQmlkcywgbmEucm0gPSBUUlVFKQogICAgYXZlcmFnZV9hc2tbaSwgbl0gPC0gbWVhbihBc2tzLCBuYS5ybSA9IFRSVUUpCiAgfQp9CgojIENhbGN1bGF0ZSB0aGUgb3ZlcmFsbCBhdmVyYWdlIGZvciBlYWNoIHBvc2l0aW9uIGFjcm9zcyBhbGwgc2ltdWxhdGlvbnMKb3ZlcmFsbF9hdmVyYWdlX2JpZCA8LSByb3dNZWFucyhhdmVyYWdlX2JpZCwgbmEucm0gPSBUUlVFKQpvdmVyYWxsX2F2ZXJhZ2VfYXNrIDwtIHJvd01lYW5zKGF2ZXJhZ2VfYXNrLCBuYS5ybSA9IFRSVUUpCgojIyBUcnVlIFZhbHVlCiMgSW5pdGlhbGl6ZSBtYXRyaWNlcyB0byBzdG9yZSBhdmVyYWdlcyBmb3IgZWFjaCBwb3NpdGlvbgphdmVyYWdlX3RydWUgPC0gbWF0cml4KE5BLCBucm93ID0gMTAwLCBuY29sID0gMTApCmF2ZXJhZ2VfZXhwZWN0ZWQgPC0gbWF0cml4KE5BLCBucm93ID0gMTAwLCBuY29sID0gMTApCgojIExvb3AgdGhyb3VnaCBlYWNoIHNpbXVsYXRpb24gKG4pCmZvciAobiBpbiAxOjEwKSB7CiAgIyBFeHRyYWN0IFRydWUgdmFsdWVzIGZyb20gdGhlIGFnZ3JlZ2F0ZWRfcmVzdWx0c180IGRhdGFmcmFtZQogIFRydWVWYWx1ZXNfc2V0MTUgPC0gc3Ryc3BsaXQoZ3N1YigiXFxbfFxcXSIsICIiLCB1bmxpc3QoYWdncmVnYXRlZF9yZXN1bHRzXzE1W24sIDJdKSksICIsICIpCiAgCiAgIyBFeHRyYWN0IEV4cGVjdGVkIHZhbHVlcyBmcm9tIHRoZSBhZ2dyZWdhdGVkX3Jlc3VsdHNfNCBkYXRhZnJhbWUKICBFeHBlY3RlZFZhbHVlc19zZXQxNSA8LSBzdHJzcGxpdChnc3ViKCJcXFt8XFxdIiwgIiIsIHVubGlzdChhZ2dyZWdhdGVkX3Jlc3VsdHNfMTVbbiwgM10pKSwgIiwgIikKICAKICAjIExvb3AgdGhyb3VnaCBlYWNoIHBvc2l0aW9uIChpKQogIGZvciAoaSBpbiAxOjEwMCkgewogICAgIyBFeHRyYWN0IFRydWUgYW5kIEV4cGVjdGVkIHZhbHVlcyBmb3IgdGhlIGktdGggcG9zaXRpb24KICAgIFRydWVfdmFsdWVzIDwtIHNhcHBseShUcnVlVmFsdWVzX3NldDE1LCBmdW5jdGlvbih4KSBhcy5udW1lcmljKHhbaV0pKQogICAgRXhwZWN0ZWRfdmFsdWVzIDwtIHNhcHBseShFeHBlY3RlZFZhbHVlc19zZXQxNSwgZnVuY3Rpb24oeCkgYXMubnVtZXJpYyh4W2ldKSkKICAgIAogICAgIyBDYWxjdWxhdGUgdGhlIGF2ZXJhZ2Ugb2YgVHJ1ZSBhbmQgRXhwZWN0ZWQgdmFsdWVzIGZvciB0aGUgaS10aCBwb3NpdGlvbgogICAgYXZlcmFnZV90cnVlW2ksIG5dIDwtIG1lYW4oVHJ1ZV92YWx1ZXMsIG5hLnJtID0gVFJVRSkKICAgIGF2ZXJhZ2VfZXhwZWN0ZWRbaSwgbl0gPC0gbWVhbihFeHBlY3RlZF92YWx1ZXMsIG5hLnJtID0gVFJVRSkKICB9Cn0KCiMgQ2FsY3VsYXRlIHRoZSBvdmVyYWxsIGF2ZXJhZ2UgZm9yIGVhY2ggcG9zaXRpb24gYWNyb3NzIGFsbCBzaW11bGF0aW9ucwpvdmVyYWxsX2F2ZXJhZ2VfdHJ1ZSA8LSByb3dNZWFucyhhdmVyYWdlX3RydWUsIG5hLnJtID0gVFJVRSkKb3ZlcmFsbF9hdmVyYWdlX2V4cGVjdGVkIDwtIHJvd01lYW5zKGF2ZXJhZ2VfZXhwZWN0ZWQsIG5hLnJtID0gVFJVRSkKCiMgUGxvdCB0aGUgb3ZlcmFsbCBhdmVyYWdlcwojcGxvdChvdmVyYWxsX2F2ZXJhZ2VfdHJ1ZSwgdHlwZSA9ICJsIiwgcGNoID0gMTYsIGNvbCA9ICJibHVlIiwgbWFpbiA9ICJPdmVyYWxsIEF2ZXJhZ2Ugb2YgVHJ1ZSB2cyBFeHBlY3RlZCBWYWx1ZXMiLCB4bGFiID0gIlBvc2l0aW9uIGluIExpc3QiLCB5bGFiID0gIlZhbHVlIiwgeWxpbSA9IGMobWluKGMob3ZlcmFsbF9hdmVyYWdlX3RydWUsIG92ZXJhbGxfYXZlcmFnZV9leHBlY3RlZCkpLCBtYXgoYyhvdmVyYWxsX2F2ZXJhZ2VfdHJ1ZSwgb3ZlcmFsbF9hdmVyYWdlX2V4cGVjdGVkKSkpKQojbGluZXMob3ZlcmFsbF9hdmVyYWdlX2V4cGVjdGVkLCB0eXBlID0gImwiLCBwY2ggPSAxNiwgY29sID0gInJlZCIpCiNsZWdlbmQoInRvcHJpZ2h0IiwgbGVnZW5kID0gYygiVHJ1ZSBWYWx1ZXMiLCAiRXhwZWN0ZWQgVmFsdWVzIiksIGNvbCA9IGMoImJsdWUiLCAicmVkIiksIGx0eSA9IDEsIGNleCA9IDAuOCkKCiMgUGxvdCB0aGUgb3ZlcmFsbCBhdmVyYWdlcwpwbG90KG92ZXJhbGxfYXZlcmFnZV9iaWQsIHR5cGUgPSAibCIsIHBjaCA9IDE2LCBjb2wgPSAiYmx1ZSIsIG1haW4gPSAiT3ZlcmFsbCBBdmVyYWdlIG9mIEJpZHMgdnMgQXNrcyAmIFRydWUgdnMgRXhwZWN0ZWQgVmFsdWVzIiwgeGxhYiA9ICJQb3NpdGlvbiBpbiBMaXN0IiwgeWxhYiA9ICJWYWx1ZSIsIHlsaW0gPSBjKG1pbihjKG92ZXJhbGxfYXZlcmFnZV9iaWQsIG92ZXJhbGxfYXZlcmFnZV9hc2ssIG92ZXJhbGxfYXZlcmFnZV90cnVlLCBvdmVyYWxsX2F2ZXJhZ2VfZXhwZWN0ZWQpKSwgbWF4KGMob3ZlcmFsbF9hdmVyYWdlX2JpZCwgb3ZlcmFsbF9hdmVyYWdlX2Fzaywgb3ZlcmFsbF9hdmVyYWdlX3RydWUsIG92ZXJhbGxfYXZlcmFnZV9leHBlY3RlZCkpKSkKbGluZXMob3ZlcmFsbF9hdmVyYWdlX2FzaywgdHlwZSA9ICJsIiwgcGNoID0gMTYsIGNvbCA9ICJyZWQiKQpsaW5lcyhvdmVyYWxsX2F2ZXJhZ2VfdHJ1ZSwgdHlwZSA9ICJsIiwgcGNoID0gMTYsIGNvbCA9ICJncmVlbiIpCmxpbmVzKG92ZXJhbGxfYXZlcmFnZV9leHBlY3RlZCwgdHlwZSA9ICJsIiwgcGNoID0gMTYsIGNvbCA9ICJwdXJwbGUiKQpsZWdlbmQoImJvdHRvbWxlZnQiLCBsZWdlbmQgPSBjKCJCaWRzIiwgIkFza3MiLCAiVHJ1ZSBWYWx1ZSIsICJFeHBlY3RlZCBWYWx1ZSIpLCBjb2wgPSBjKCJibHVlIiwgInJlZCIsICJncmVlbiIsICJwdXJwbGUiKSwgbHR5ID0gMSwgY2V4ID0gMC44KQpgYGAKCmBgYHtyfQojIEluaXRpYWxpemUgbWF0cmljZXMgdG8gc3RvcmUgYXZlcmFnZXMgZm9yIGVhY2ggcG9zaXRpb24KYXZlcmFnZV9NTV9wbmwgPC0gbWF0cml4KE5BLCBucm93ID0gMTAwLCBuY29sID0gMTApCmF2ZXJhZ2VfSW5mb3JtZWRfcG5sIDwtIG1hdHJpeChOQSwgbnJvdyA9IDEwMCwgbmNvbCA9IDEwKQphdmVyYWdlX05vaXN5SW5mb3JtZWQxX3BubCA8LSBtYXRyaXgoTkEsIG5yb3cgPSAxMDAsIG5jb2wgPSAxMCkKYXZlcmFnZV9Ob2lzeUluZm9ybWVkMl9wbmwgPC0gbWF0cml4KE5BLCBucm93ID0gMTAwLCBuY29sID0gMTApCmF2ZXJhZ2VfTm9pc3kxX3BubCA8LSBtYXRyaXgoTkEsIG5yb3cgPSAxMDAsIG5jb2wgPSAxMCkKYXZlcmFnZV9Ob2lzeTJfcG5sIDwtIG1hdHJpeChOQSwgbnJvdyA9IDEwMCwgbmNvbCA9IDEwKQphdmVyYWdlX21vbV9wbmwgPC0gbWF0cml4KE5BLCBucm93ID0gMTAwLCBuY29sID0gMTApCgojIExvb3AgdGhyb3VnaCBlYWNoIHNpbXVsYXRpb24gKG4pCmZvciAobiBpbiAxOjEwKSB7CgogIE1NX3BubF9zZXQxNSA8LSBzdHJzcGxpdChnc3ViKCJcXFt8XFxdIiwgIiIsIHVubGlzdChhZ2dyZWdhdGVkX3Jlc3VsdHNfMTVbbiwgNl0pKSwgIiwgIikKCiAgSW5mb3JtZWRfcG5sX3NldDE1IDwtIHN0cnNwbGl0KGdzdWIoIlxcW3xcXF0iLCAiIiwgdW5saXN0KGFnZ3JlZ2F0ZWRfcmVzdWx0c18xNVtuLCA4XSkpLCAiLCAiKQogIAogIE5vaXN5SW5mb3JtZWQxX3BubF9zZXQxNSA8LSBzdHJzcGxpdChnc3ViKCJcXFt8XFxdIiwgIiIsIHVubGlzdChhZ2dyZWdhdGVkX3Jlc3VsdHNfMTVbbiwgMTBdKSksICIsICIpCiAgCiAgTm9pc3lJbmZvcm1lZDJfcG5sX3NldDE1IDwtIHN0cnNwbGl0KGdzdWIoIlxcW3xcXF0iLCAiIiwgdW5saXN0KGFnZ3JlZ2F0ZWRfcmVzdWx0c18xNVtuLCAxMl0pKSwgIiwgIikKICAKICBOb2lzeTFfcG5sX3NldDE1IDwtIHN0cnNwbGl0KGdzdWIoIlxcW3xcXF0iLCAiIiwgdW5saXN0KGFnZ3JlZ2F0ZWRfcmVzdWx0c18xNVtuLCAxNF0pKSwgIiwgIikKICAKICBOb2lzeTJfcG5sX3NldDE1IDwtIHN0cnNwbGl0KGdzdWIoIlxcW3xcXF0iLCAiIiwgdW5saXN0KGFnZ3JlZ2F0ZWRfcmVzdWx0c18xNVtuLCAxNl0pKSwgIiwgIikKICAKICBtb21fcG5sX3NldDE1IDwtIHN0cnNwbGl0KGdzdWIoIlxcW3xcXF0iLCAiIiwgdW5saXN0KGFnZ3JlZ2F0ZWRfcmVzdWx0c18xNVtuLCAxOF0pKSwgIiwgIikKICAKICAjIExvb3AgdGhyb3VnaCBlYWNoIHBvc2l0aW9uIChpKQogIGZvciAoaSBpbiAxOjEwMCkgewogICAgIyBFeHRyYWN0IFRydWUgYW5kIEV4cGVjdGVkIHZhbHVlcyBmb3IgdGhlIGktdGggcG9zaXRpb24KICAgIE1NX3BubCA8LSBzYXBwbHkoTU1fcG5sX3NldDE1LCBmdW5jdGlvbih4KSBhcy5udW1lcmljKHhbaV0pKQogICAgSW5mb3JtZWRfcG5sIDwtIHNhcHBseShJbmZvcm1lZF9wbmxfc2V0MTUsIGZ1bmN0aW9uKHgpIGFzLm51bWVyaWMoeFtpXSkpCiAgICBOb2lzeUluZm9ybWVkMV9wbmwgPC0gc2FwcGx5KE5vaXN5SW5mb3JtZWQxX3BubF9zZXQxNSwgZnVuY3Rpb24oeCkgYXMubnVtZXJpYyh4W2ldKSkKICAgIE5vaXN5SW5mb3JtZWQyX3BubCA8LSBzYXBwbHkoTm9pc3lJbmZvcm1lZDJfcG5sX3NldDE1LCBmdW5jdGlvbih4KSBhcy5udW1lcmljKHhbaV0pKQogICAgTm9pc3kxX3BubCA8LSBzYXBwbHkoTm9pc3kxX3BubF9zZXQxNSwgZnVuY3Rpb24oeCkgYXMubnVtZXJpYyh4W2ldKSkKICAgIE5vaXN5Ml9wbmwgPC0gc2FwcGx5KE5vaXN5Ml9wbmxfc2V0MTUsIGZ1bmN0aW9uKHgpIGFzLm51bWVyaWMoeFtpXSkpCiAgICBtb21fcG5sIDwtIHNhcHBseShtb21fcG5sX3NldDE1LCBmdW5jdGlvbih4KSBhcy5udW1lcmljKHhbaV0pKQogICAgCiAgICAjIENhbGN1bGF0ZSB0aGUgYXZlcmFnZSBvZiBUcnVlIGFuZCBFeHBlY3RlZCB2YWx1ZXMgZm9yIHRoZSBpLXRoIHBvc2l0aW9uCiAgICBhdmVyYWdlX01NX3BubFtpLCBuXSA8LSBtZWFuKE1NX3BubCwgbmEucm0gPSBUUlVFKQogICAgYXZlcmFnZV9JbmZvcm1lZF9wbmxbaSwgbl0gPC0gbWVhbihJbmZvcm1lZF9wbmwsIG5hLnJtID0gVFJVRSkKICAgIGF2ZXJhZ2VfTm9pc3lJbmZvcm1lZDFfcG5sW2ksIG5dIDwtIG1lYW4oTm9pc3lJbmZvcm1lZDFfcG5sLCBuYS5ybSA9IFRSVUUpCiAgICBhdmVyYWdlX05vaXN5SW5mb3JtZWQyX3BubFtpLCBuXSA8LSBtZWFuKE5vaXN5SW5mb3JtZWQyX3BubCwgbmEucm0gPSBUUlVFKQogICAgYXZlcmFnZV9Ob2lzeTFfcG5sW2ksIG5dIDwtIG1lYW4oTm9pc3kxX3BubCwgbmEucm0gPSBUUlVFKQogICAgYXZlcmFnZV9Ob2lzeTJfcG5sW2ksIG5dIDwtIG1lYW4oTm9pc3kyX3BubCwgbmEucm0gPSBUUlVFKQogICAgYXZlcmFnZV9tb21fcG5sW2ksIG5dIDwtIG1lYW4obW9tX3BubCwgbmEucm0gPSBUUlVFKQogIH0KfQoKIyBDYWxjdWxhdGUgdGhlIG92ZXJhbGwgYXZlcmFnZSBmb3IgZWFjaCBwb3NpdGlvbiBhY3Jvc3MgYWxsIHNpbXVsYXRpb25zCm92ZXJhbGxfYXZlcmFnZV9NTV9wbmwgPC0gcm93TWVhbnMoYXZlcmFnZV9NTV9wbmwsIG5hLnJtID0gVFJVRSkKb3ZlcmFsbF9hdmVyYWdlX0luZm9ybWVkX3BubCA8LSByb3dNZWFucyhhdmVyYWdlX0luZm9ybWVkX3BubCwgbmEucm0gPSBUUlVFKQpvdmVyYWxsX2F2ZXJhZ2VfTm9pc3lJbmZvcm1lZDFfcG5sIDwtIHJvd01lYW5zKGF2ZXJhZ2VfTm9pc3lJbmZvcm1lZDFfcG5sLCBuYS5ybSA9IFRSVUUpCm92ZXJhbGxfYXZlcmFnZV9Ob2lzeUluZm9ybWVkMl9wbmwgPC0gcm93TWVhbnMoYXZlcmFnZV9Ob2lzeUluZm9ybWVkMl9wbmwsIG5hLnJtID0gVFJVRSkKb3ZlcmFsbF9hdmVyYWdlX05vaXN5MV9wbmwgPC0gcm93TWVhbnMoYXZlcmFnZV9Ob2lzeTFfcG5sLCBuYS5ybSA9IFRSVUUpCm92ZXJhbGxfYXZlcmFnZV9Ob2lzeTJfcG5sIDwtIHJvd01lYW5zKGF2ZXJhZ2VfTm9pc3kyX3BubCwgbmEucm0gPSBUUlVFKQpvdmVyYWxsX2F2ZXJhZ2VfbW9tX3BubCA8LSByb3dNZWFucyhhdmVyYWdlX21vbV9wbmwsIG5hLnJtID0gVFJVRSkKCiMgUGxvdCB0aGUgb3ZlcmFsbCBhdmVyYWdlcwpwbG90KG92ZXJhbGxfYXZlcmFnZV9NTV9wbmwsIHR5cGUgPSAibCIsIHBjaCA9IDE2LCBjb2wgPSAiYmxhY2siLCBtYWluID0gIk92ZXJhbGwgQXZlcmFnZSBQTkwiLCB4bGFiID0gIlBvc2l0aW9uIGluIExpc3QiLCB5bGFiID0gIlZhbHVlIiwgeWxpbSA9IGMobWluKGMob3ZlcmFsbF9hdmVyYWdlX01NX3BubCwgb3ZlcmFsbF9hdmVyYWdlX0luZm9ybWVkX3BubCwgb3ZlcmFsbF9hdmVyYWdlX05vaXN5SW5mb3JtZWQxX3BubCwgb3ZlcmFsbF9hdmVyYWdlX05vaXN5SW5mb3JtZWQyX3BubCwgb3ZlcmFsbF9hdmVyYWdlX05vaXN5MV9wbmwsIG92ZXJhbGxfYXZlcmFnZV9Ob2lzeTJfcG5sLCBvdmVyYWxsX2F2ZXJhZ2VfbW9tX3BubCkpLCBtYXgoYyhvdmVyYWxsX2F2ZXJhZ2VfTU1fcG5sLCBvdmVyYWxsX2F2ZXJhZ2VfSW5mb3JtZWRfcG5sLCBvdmVyYWxsX2F2ZXJhZ2VfTm9pc3lJbmZvcm1lZDFfcG5sLCBvdmVyYWxsX2F2ZXJhZ2VfTm9pc3lJbmZvcm1lZDJfcG5sLCBvdmVyYWxsX2F2ZXJhZ2VfTm9pc3kxX3BubCwgb3ZlcmFsbF9hdmVyYWdlX05vaXN5Ml9wbmwsIG92ZXJhbGxfYXZlcmFnZV9tb21fcG5sKSkpKQpsaW5lcyhvdmVyYWxsX2F2ZXJhZ2VfSW5mb3JtZWRfcG5sLCB0eXBlID0gImwiLCBwY2ggPSAxNiwgY29sID0gInJlZCIpCmxpbmVzKG92ZXJhbGxfYXZlcmFnZV9Ob2lzeUluZm9ybWVkMV9wbmwsIHR5cGUgPSAibCIsIHBjaCA9IDE2LCBjb2wgPSAiZ3JlZW4iKQpsaW5lcyhvdmVyYWxsX2F2ZXJhZ2VfTm9pc3lJbmZvcm1lZDJfcG5sLCB0eXBlID0gImwiLCBwY2ggPSAxNiwgY29sID0gInllbGxvdyIpCmxpbmVzKG92ZXJhbGxfYXZlcmFnZV9Ob2lzeTFfcG5sLCB0eXBlID0gImwiLCBwY2ggPSAxNiwgY29sID0gImJsdWUiKQpsaW5lcyhvdmVyYWxsX2F2ZXJhZ2VfTm9pc3kyX3BubCwgdHlwZSA9ICJsIiwgcGNoID0gMTYsIGNvbCA9ICJwdXJwbGUiKQpsaW5lcyhvdmVyYWxsX2F2ZXJhZ2VfbW9tX3BubCwgdHlwZSA9ICJsIiwgcGNoID0gMTYsIGNvbCA9ICJvcmFuZ2UiKQoKIyBBZGQgbGVnZW5kCmxlZ2VuZCgiYm90dG9tbGVmdCIsIGxlZ2VuZCA9IGMoIk1hcmtldCBNYWtlciIsICJJbmZvcm1lZCIsICJOb2lzeSBJbmZvcm1lZCAxIiwgIk5vaXN5IEluZm9ybWVkIDIiLCAiTm9pc3kgMSIsICJOb2lzeSAyIiwgIk1vbWVudHVtIiksIGNvbCA9IGMoImJsYWNrIiwgInJlZCIsICJncmVlbiIsICJ5ZWxsb3ciLCAiYmx1ZSIsICJwdXJwbGUiLCAib3JhbmdlIiksIGx0eSA9IDEsIGNleCA9IDAuOCkKYGBgCgoKCgoKYGBge3J9CiMgSW5pdGlhbGl6ZSBtYXRyaWNlcyB0byBzdG9yZSBhdmVyYWdlcyBmb3IgZWFjaCBwb3NpdGlvbgphdmVyYWdlX01NX3BvcyA8LSBtYXRyaXgoTkEsIG5yb3cgPSAxMDAsIG5jb2wgPSAxMCkKYXZlcmFnZV9JbmZvcm1lZF9wb3MgPC0gbWF0cml4KE5BLCBucm93ID0gMTAwLCBuY29sID0gMTApCmF2ZXJhZ2VfTm9pc3lJbmZvcm1lZDFfcG9zIDwtIG1hdHJpeChOQSwgbnJvdyA9IDEwMCwgbmNvbCA9IDEwKQphdmVyYWdlX05vaXN5SW5mb3JtZWQyX3BvcyA8LSBtYXRyaXgoTkEsIG5yb3cgPSAxMDAsIG5jb2wgPSAxMCkKYXZlcmFnZV9Ob2lzeTFfcG9zIDwtIG1hdHJpeChOQSwgbnJvdyA9IDEwMCwgbmNvbCA9IDEwKQphdmVyYWdlX05vaXN5Ml9wb3MgPC0gbWF0cml4KE5BLCBucm93ID0gMTAwLCBuY29sID0gMTApCmF2ZXJhZ2VfbW9tX3BvcyA8LSBtYXRyaXgoTkEsIG5yb3cgPSAxMDAsIG5jb2wgPSAxMCkKCiMgTG9vcCB0aHJvdWdoIGVhY2ggc2ltdWxhdGlvbiAobikKZm9yIChuIGluIDE6MTApIHsKCiAgTU1fcG9zX3NldDE1IDwtIHN0cnNwbGl0KGdzdWIoIlxcW3xcXF0iLCAiIiwgdW5saXN0KGFnZ3JlZ2F0ZWRfcmVzdWx0c18xNVtuLCA3XSkpLCAiLCAiKQoKICBJbmZvcm1lZF9wb3Nfc2V0MTUgPC0gc3Ryc3BsaXQoZ3N1YigiXFxbfFxcXSIsICIiLCB1bmxpc3QoYWdncmVnYXRlZF9yZXN1bHRzXzE1W24sIDldKSksICIsICIpCiAgCiAgTm9pc3lJbmZvcm1lZDFfcG9zX3NldDE1IDwtIHN0cnNwbGl0KGdzdWIoIlxcW3xcXF0iLCAiIiwgdW5saXN0KGFnZ3JlZ2F0ZWRfcmVzdWx0c18xNVtuLCAxMV0pKSwgIiwgIikKICAKICBOb2lzeUluZm9ybWVkMl9wb3Nfc2V0MTUgPC0gc3Ryc3BsaXQoZ3N1YigiXFxbfFxcXSIsICIiLCB1bmxpc3QoYWdncmVnYXRlZF9yZXN1bHRzXzE1W24sIDEzXSkpLCAiLCAiKQogIAogIE5vaXN5MV9wb3Nfc2V0MTUgPC0gc3Ryc3BsaXQoZ3N1YigiXFxbfFxcXSIsICIiLCB1bmxpc3QoYWdncmVnYXRlZF9yZXN1bHRzXzE1W24sIDE1XSkpLCAiLCAiKQogIAogIE5vaXN5Ml9wb3Nfc2V0MTUgPC0gc3Ryc3BsaXQoZ3N1YigiXFxbfFxcXSIsICIiLCB1bmxpc3QoYWdncmVnYXRlZF9yZXN1bHRzXzE1W24sIDE3XSkpLCAiLCAiKQogIAogIG1vbV9wb3Nfc2V0MTUgPC0gc3Ryc3BsaXQoZ3N1YigiXFxbfFxcXSIsICIiLCB1bmxpc3QoYWdncmVnYXRlZF9yZXN1bHRzXzE1W24sIDE5XSkpLCAiLCAiKQogIAogICMgTG9vcCB0aHJvdWdoIGVhY2ggcG9zaXRpb24gKGkpCiAgZm9yIChpIGluIDE6MTAwKSB7CiAgICAjIEV4dHJhY3QgVHJ1ZSBhbmQgRXhwZWN0ZWQgdmFsdWVzIGZvciB0aGUgaS10aCBwb3NpdGlvbgogICAgTU1fcG9zIDwtIHNhcHBseShNTV9wb3Nfc2V0MTUsIGZ1bmN0aW9uKHgpIGFzLm51bWVyaWMoeFtpXSkpCiAgICBJbmZvcm1lZF9wb3MgPC0gc2FwcGx5KEluZm9ybWVkX3Bvc19zZXQxNSwgZnVuY3Rpb24oeCkgYXMubnVtZXJpYyh4W2ldKSkKICAgIE5vaXN5SW5mb3JtZWQxX3BvcyA8LSBzYXBwbHkoTm9pc3lJbmZvcm1lZDFfcG9zX3NldDE1LCBmdW5jdGlvbih4KSBhcy5udW1lcmljKHhbaV0pKQogICAgTm9pc3lJbmZvcm1lZDJfcG9zIDwtIHNhcHBseShOb2lzeUluZm9ybWVkMl9wb3Nfc2V0MTUsIGZ1bmN0aW9uKHgpIGFzLm51bWVyaWMoeFtpXSkpCiAgICBOb2lzeTFfcG9zIDwtIHNhcHBseShOb2lzeTFfcG9zX3NldDE1LCBmdW5jdGlvbih4KSBhcy5udW1lcmljKHhbaV0pKQogICAgTm9pc3kyX3BvcyA8LSBzYXBwbHkoTm9pc3kyX3Bvc19zZXQxNSwgZnVuY3Rpb24oeCkgYXMubnVtZXJpYyh4W2ldKSkKICAgIG1vbV9wb3MgPC0gc2FwcGx5KG1vbV9wb3Nfc2V0MTUsIGZ1bmN0aW9uKHgpIGFzLm51bWVyaWMoeFtpXSkpCiAgICAKICAgICMgQ2FsY3VsYXRlIHRoZSBhdmVyYWdlIG9mIFRydWUgYW5kIEV4cGVjdGVkIHZhbHVlcyBmb3IgdGhlIGktdGggcG9zaXRpb24KICAgIGF2ZXJhZ2VfTU1fcG9zW2ksIG5dIDwtIG1lYW4oTU1fcG9zLCBuYS5ybSA9IFRSVUUpCiAgICBhdmVyYWdlX0luZm9ybWVkX3Bvc1tpLCBuXSA8LSBtZWFuKEluZm9ybWVkX3BvcywgbmEucm0gPSBUUlVFKQogICAgYXZlcmFnZV9Ob2lzeUluZm9ybWVkMV9wb3NbaSwgbl0gPC0gbWVhbihOb2lzeUluZm9ybWVkMV9wb3MsIG5hLnJtID0gVFJVRSkKICAgIGF2ZXJhZ2VfTm9pc3lJbmZvcm1lZDJfcG9zW2ksIG5dIDwtIG1lYW4oTm9pc3lJbmZvcm1lZDJfcG9zLCBuYS5ybSA9IFRSVUUpCiAgICBhdmVyYWdlX05vaXN5MV9wb3NbaSwgbl0gPC0gbWVhbihOb2lzeTFfcG9zLCBuYS5ybSA9IFRSVUUpCiAgICBhdmVyYWdlX05vaXN5Ml9wb3NbaSwgbl0gPC0gbWVhbihOb2lzeTJfcG9zLCBuYS5ybSA9IFRSVUUpCiAgICBhdmVyYWdlX21vbV9wb3NbaSwgbl0gPC0gbWVhbihtb21fcG9zLCBuYS5ybSA9IFRSVUUpCiAgfQp9CgojIENhbGN1bGF0ZSB0aGUgb3ZlcmFsbCBhdmVyYWdlIGZvciBlYWNoIHBvc2l0aW9uIGFjcm9zcyBhbGwgc2ltdWxhdGlvbnMKb3ZlcmFsbF9hdmVyYWdlX01NX3BvcyA8LSByb3dNZWFucyhhdmVyYWdlX01NX3BvcywgbmEucm0gPSBUUlVFKQpvdmVyYWxsX2F2ZXJhZ2VfSW5mb3JtZWRfcG9zIDwtIHJvd01lYW5zKGF2ZXJhZ2VfSW5mb3JtZWRfcG9zLCBuYS5ybSA9IFRSVUUpCm92ZXJhbGxfYXZlcmFnZV9Ob2lzeUluZm9ybWVkMV9wb3MgPC0gcm93TWVhbnMoYXZlcmFnZV9Ob2lzeUluZm9ybWVkMV9wb3MsIG5hLnJtID0gVFJVRSkKb3ZlcmFsbF9hdmVyYWdlX05vaXN5SW5mb3JtZWQyX3BvcyA8LSByb3dNZWFucyhhdmVyYWdlX05vaXN5SW5mb3JtZWQyX3BvcywgbmEucm0gPSBUUlVFKQpvdmVyYWxsX2F2ZXJhZ2VfTm9pc3kxX3BvcyA8LSByb3dNZWFucyhhdmVyYWdlX05vaXN5MV9wb3MsIG5hLnJtID0gVFJVRSkKb3ZlcmFsbF9hdmVyYWdlX05vaXN5Ml9wb3MgPC0gcm93TWVhbnMoYXZlcmFnZV9Ob2lzeTJfcG9zLCBuYS5ybSA9IFRSVUUpCm92ZXJhbGxfYXZlcmFnZV9tb21fcG9zIDwtIHJvd01lYW5zKGF2ZXJhZ2VfbW9tX3BvcywgbmEucm0gPSBUUlVFKQoKIyBQbG90IHRoZSBvdmVyYWxsIGF2ZXJhZ2VzCnBsb3Qob3ZlcmFsbF9hdmVyYWdlX01NX3BvcywgdHlwZSA9ICJsIiwgcGNoID0gMTYsIGNvbCA9ICJibGFjayIsIG1haW4gPSAiT3ZlcmFsbCBBdmVyYWdlIFBvc2l0aW9uIiwgeGxhYiA9ICJQb3NpdGlvbiBpbiBMaXN0IiwgeWxhYiA9ICJWYWx1ZSIsIHlsaW0gPSBjKG1pbihjKG92ZXJhbGxfYXZlcmFnZV9NTV9wb3MsIG92ZXJhbGxfYXZlcmFnZV9JbmZvcm1lZF9wb3MsIG92ZXJhbGxfYXZlcmFnZV9Ob2lzeUluZm9ybWVkMV9wb3MsIG92ZXJhbGxfYXZlcmFnZV9Ob2lzeUluZm9ybWVkMl9wb3MsIG92ZXJhbGxfYXZlcmFnZV9Ob2lzeTFfcG9zLCBvdmVyYWxsX2F2ZXJhZ2VfTm9pc3kyX3Bvcywgb3ZlcmFsbF9hdmVyYWdlX21vbV9wb3MpKSwgbWF4KGMob3ZlcmFsbF9hdmVyYWdlX01NX3Bvcywgb3ZlcmFsbF9hdmVyYWdlX0luZm9ybWVkX3Bvcywgb3ZlcmFsbF9hdmVyYWdlX05vaXN5SW5mb3JtZWQxX3Bvcywgb3ZlcmFsbF9hdmVyYWdlX05vaXN5SW5mb3JtZWQyX3Bvcywgb3ZlcmFsbF9hdmVyYWdlX05vaXN5MV9wb3MsIG92ZXJhbGxfYXZlcmFnZV9Ob2lzeTJfcG9zLCBvdmVyYWxsX2F2ZXJhZ2VfbW9tX3BvcykpKSkKbGluZXMob3ZlcmFsbF9hdmVyYWdlX0luZm9ybWVkX3BvcywgdHlwZSA9ICJsIiwgcGNoID0gMTYsIGNvbCA9ICJyZWQiKQpsaW5lcyhvdmVyYWxsX2F2ZXJhZ2VfTm9pc3lJbmZvcm1lZDFfcG9zLCB0eXBlID0gImwiLCBwY2ggPSAxNiwgY29sID0gImdyZWVuIikKbGluZXMob3ZlcmFsbF9hdmVyYWdlX05vaXN5SW5mb3JtZWQyX3BvcywgdHlwZSA9ICJsIiwgcGNoID0gMTYsIGNvbCA9ICJ5ZWxsb3ciKQpsaW5lcyhvdmVyYWxsX2F2ZXJhZ2VfTm9pc3kxX3BvcywgdHlwZSA9ICJsIiwgcGNoID0gMTYsIGNvbCA9ICJibHVlIikKbGluZXMob3ZlcmFsbF9hdmVyYWdlX05vaXN5Ml9wb3MsIHR5cGUgPSAibCIsIHBjaCA9IDE2LCBjb2wgPSAicHVycGxlIikKbGluZXMob3ZlcmFsbF9hdmVyYWdlX21vbV9wb3MsIHR5cGUgPSAibCIsIHBjaCA9IDE2LCBjb2wgPSAib3JhbmdlIikKCiMgQWRkIGxlZ2VuZApsZWdlbmQoImJvdHRvbWxlZnQiLCBsZWdlbmQgPSBjKCJNYXJrZXQgTWFrZXIiLCAiSW5mb3JtZWQiLCAiTm9pc3kgSW5mb3JtZWQgMSIsICJOb2lzeSBJbmZvcm1lZCAyIiwgIk5vaXN5IDEiLCAiTm9pc3kgMiIsICJNb21lbnR1bSIpLCBjb2wgPSBjKCJibGFjayIsICJyZWQiLCAiZ3JlZW4iLCAieWVsbG93IiwgImJsdWUiLCAicHVycGxlIiwgIm9yYW5nZSIpLCBsdHkgPSAxLCBjZXggPSAwLjgpCmBgYAoKCgoKCgoKCgoKCgo=